【发布时间】:2011-11-24 16:54:19
【问题描述】:
标题几乎说明了一切..
我想做的是编写一个工具来监控一个包含插件的 dll 文件,当我覆盖它时,通过重新编译,它应该会自动重新加载它。 我知道我可以制作副本、加载副本并监控原件,但我认为可能有更好的方法.. 如果我理解正确,则 dll 已完全加载到内存中,因此删除文件应该没有问题..
【问题讨论】:
标题几乎说明了一切..
我想做的是编写一个工具来监控一个包含插件的 dll 文件,当我覆盖它时,通过重新编译,它应该会自动重新加载它。 我知道我可以制作副本、加载副本并监控原件,但我认为可能有更好的方法.. 如果我理解正确,则 dll 已完全加载到内存中,因此删除文件应该没有问题..
【问题讨论】:
不,这不是 Windows 的工作方式。加载 DLL 只会创建一个内存映射文件,除了重定位(如有必要)之外,实际上不会从文件中读取任何内容。直到您的代码调用导出的函数。这会导致页面错误,因为代码尚未加载。现在代码从文件中读取到 RAM 中。如果其他进程需要空间,那么页面就会被取消映射。在下一页错误时再次重新加载。
MMF 对文件进行了硬锁定。您只能重命名它,不能覆盖或删除它。那会使程序崩溃。使用 FreeLibrary() 释放锁。
【讨论】:
还没有尝试过,我现在不在我的 Windows 机器上,但我认为 Windows 在加载 DLL 时会锁定文件以防止写入。您应该首先检查一下,您是否真的会覆盖 DLL(例如通过编译新版本)或者编译器是否会抱怨“权限被拒绝”。
否则我想你可以使用file change notification API 来实现你的目标。
【讨论】: