我是否可以以可以在加载时删除 dll 的方式加载它?

Can I load a dll in such a way that it can be deleted while it's loaded?

本文关键字:加载 方式 dll 是否 删除      更新时间:2023-10-16

标题已经说明了一切。

我要做的是写一个工具,它将监视包含插件的dll文件,当我重写它时,通过重新编译,它应该自动重新加载它。我知道我可以制作一个副本,加载副本并监控原始版本,但我认为可能有更好的方法…如果我理解正确的话,dll是完全加载到内存中的,所以在删除文件时应该不会有问题。

不,Windows不是这样工作的。加载DLL只是创建一个内存映射文件,实际上除了重定位(如果需要的话)之外没有从文件中读取任何内容。除非您的代码调用导出函数。这会导致页面错误,因为代码尚未加载。现在,代码从文件中读取到RAM中。如果其他进程需要空间,那么页面就会被取消映射。在下一页重新加载错误。

MMF对文件加了一个硬锁。您只能重命名它,不能覆盖或删除它。那会使程序崩溃。使用FreeLibrary()释放锁

还没有尝试过,我现在不在我的Windows机器上,但我认为Windows在加载DLL时锁定了文件。你应该首先检查,你是否真的覆盖DLL(例如,通过编译一个新版本),或者编译器会抱怨"权限被拒绝"。

否则我想你可以使用文件更改通知API来实现你的目标。