我有几个使用某个.dll文件运行的游戏服务器。有时我需要更新游戏服务器,但我不想中断已经在运行的游戏。
有没有办法替换.dll文件(该文件已被Windows锁定),因此使用该文件的游戏服务器的下一个实例将打开新版本,而旧服务器将继续使用该.dll的旧版本,直到重新启动它们为止。 ?
使用执行该操作的工具之一来解锁并替换文件是否安全?
我有几个使用某个.dll文件运行的游戏服务器。有时我需要更新游戏服务器,但我不想中断已经在运行的游戏。
有没有办法替换.dll文件(该文件已被Windows锁定),因此使用该文件的游戏服务器的下一个实例将打开新版本,而旧服务器将继续使用该.dll的旧版本,直到重新启动它们为止。 ?
使用执行该操作的工具之一来解锁并替换文件是否安全?
Answers:
不会。即使在应用程序运行时DLL 可能会完全映射到物理内存中,也绝对不能保证。DLL(甚至可执行文件)的某些部分可以映射到RAM中,而其他部分仍保留在磁盘上,以后可以读取。
当Windows在RAM中映射了文件中的某些位时,更改磁盘上的文件将无法很好地完成。Windows将其锁定是有充分理由的。
编辑:我需要澄清一些事情,因为有些人似乎打算将Windows归咎于实际上是应用程序设计问题,而不是操作系统设计问题。
您可以在不终止进程的情况下更新应用程序在Windows中使用的DLL,但是必须以某种方式编写应用程序,以便可以发出信号来卸载程序集,等待更新完成,然后重新加载DLL。这与您正在运行的操作系统无关。这是一个应用程序设计问题。
编辑:又见斯特凡的答案了可能的解决方案,它的威力工作,根据您的特定应用程序响应其DLL如何变化。我认为他应该得到支持。
不,您不应该修改现有的文件句柄。
如果可以控制程序集的加载,并指定使用FileShare.Delete打开该程序集,则应该可以对其进行重命名。现有过程将继续引用重命名的程序集。
/programming/7147577/programmatically-rename-open-file-on-windows。
不,很遗憾,这是不可能的。
抱歉,确切地说,除非进行后期绑定,否则表示该应用在该dll中运行部分代码时会使用该dll,但仍不可靠。
大约十年前,我是http://www.eggcentric.com/ISAPILoader.htm的愉快用户,该站点进行了IIS ISAPI dll实时交换。Egg先生仍在支持他的FOSS解决方案。
NSIS安装程序有一个选项,例如“计算机重新启动时移至温度”,“操作系统”将某些文件标记为在下次启动时移至其他位置,在下次计算机启动时,这些标记的文件会自动移至您先前选择的新位置。对此进行一些搜索将使您对此感到满意。
%LocalAppData%\Google\Chrome\Application
,您应该会看到类似的文件夹26.0.1410.64
,其中存储了不同版本的DLL)