【发布时间】:2019-05-28 13:18:25
【问题描述】:
我们想要热重载一个 DLL。第一个想法是覆盖 .dll 文件,然后从应用程序重新加载它。但是该文件是写保护的。
是否有(记录在案的)反对论点不删除此文件保护并覆盖文件? 如果不存在这样的反论点,我们如何绕过这种保护?
编辑:在 Internet 上找到的参考资料指出 mmap 以及 DLL 可能尚未加载的事实。就我而言,(仅导出的)方法已被调用,因此我可以合理地认为 DLL 已完全加载。
【问题讨论】:
-
"我可以合理地认为 DLL 已完全加载。"但这不是你想要的相反吗?您想重新加载 DLL,但替换文件不会有任何效果,因为它已经完全加载。 (当然,真正的问题是当内存被分页并需要重新分页时。此外,导入的函数现在会指向错误的位置。)
-
你这样做有点太热了,你必须先使用 FreeLibrary()。由于无论如何您都必须重新绑定导出,所以没有理由让它比这更热。考虑 ReadDirectoryChangesW() 以检测更新被丢弃在指定位置。
-
@Raymond,该 DLL 已经被应用程序使用了一段时间,但是已经编译了一个新版本,应该会替换当前运行的行为。
-
@HansPassant,这实际上是一个很好的答案,只是我的问题有点复杂。 dll 在应用程序运行时由另一个应用程序构建。所以我们还不能释放它。到目前为止,我正在探索的解决方案是先重命名文件(似乎我可以从第三个应用程序执行此操作,而第一个应用程序仍在访问它)。