在应用程序运行时替换 .dll 文件?

27 windows windows-server-2008

我有几个使用某个 .dll 文件来运行的游戏服务器。有时我需要更新游戏服务器,但我不想中断已经运行的游戏。

有没有办法替换 .dll 文件(它被 Windows 锁定),以便使用该文件的游戏服务器的下一个实例打开新版本,而旧的则继续使用该 .dll 的旧版本,直到它们重新启动?

使用其中一种工具来解锁文件并替换它是否安全?

Ste*_*ane 29

实际上,您可以并且它通常可以正常工作(尽管并非总是如此)

您要做的是重命名文件而不移动它并将新文件移动到它上面。这将使文件句柄保持有效和工作,以便预先存在的实例仍然能够正确访问文件,并且新实例(或新句柄)将转到新文件。

显然,如果程序重新打开同一个 dll 文件并期望它保持完全相同(例如,如果有要从 dll 加载的资源,并且在加载 dll 时从运行的代码中提取对这些资源的引用) ),这会导致问题,但这绝对不是常态。


Rya*_*ies 14

不可以。即使在应用程序运行时DLL可能完全映射到物理内存中,也绝对不能保证这一点。部分 DLL(甚至可执行文件)可以映射到 RAM 中,而其他部分则保留在磁盘上,并且可以稍后读入。

在 Windows 将文件的一部分映射到 RAM 时更改磁盘上的文件不会有好结果。Windows 将其锁定是有充分理由的。

编辑:我需要澄清一些事情,因为有些人似乎打算将实际是应用程序设计问题而不是操作系统设计问题的原因归咎于 Windows 。

您可以在不终止进程的情况下更新应用程序在 Windows 中使用的 DLL,但应用程序的编写方式必须能够发出信号以卸载程序集,等待更新完成,然后重新加载 DLL。这与您运行的操作系统无关。这是一个应用程序设计问题。

编辑:又见斯特凡的答案了可能的解决方案,它的威力工作,根据您的特定应用程序响应其DLL如何变化。我认为他值得一票。