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


18

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

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

使用执行该操作的工具之一来解锁并替换文件是否安全?


也许不是您的游戏。但是,Chrome 确实会更新,而不会中断您的过程。不幸的是,这是特定于应用程序的。(转到%LocalAppData%\Google\Chrome\Application,您应该会看到类似的文件夹26.0.1410.64,其中存储了不同版本的DLL)
Alvin Wong

根据所讨论的软件,可能可以安装并运行两个或多个不同的实例(在不同的位置)。低效,但也许可行。
哈里·约翰斯顿

Answers:


23

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

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

显然,如果程序重新打开相同的dll文件并希望它保持完全相同(例如,如果从dll中加载了资源,并且从加载dll时运行的代码中提取了对这些资源的引用),这会引起问题,但这绝对不是规范。


11

不会。即使在应用程序运行时DLL 可能会完全映射到物理内存中,也绝对不能保证。DLL(甚至可执行文件)的某些部分可以映射到RAM中,而其他部分仍保留在磁盘上,以后可以读取。

当Windows在RAM中映射了文件中的某些位时,更改磁盘上的文件将无法很好地完成。Windows将其锁定是有充分理由的。

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

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

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


有什么方法可以将该文件移动到一个临时位置,以便以后可以删除它,同时在其旧位置放置一个新文件(以便在此之后启动的服务器将使用新的dll)?还是文件句柄链接到文件位置?

这完全取决于应用程序的编写方式/使用DLL的方式。看看Greg Askew的答案。如果文件句柄是打开的,那么您将无能为力。您可以强制关闭文件句柄,但几乎可以肯定至少会使您的应用程序崩溃,即使不是整个操作系统也是如此。
瑞安·里斯

那么,这个“好理由”是什么?到目前为止,您的答案还没有包含Microsoft不提供热插拔功能的令人信服的理由。
Konrad Rudolph

2

不,您不应该修改现有的文件句柄。

如果可以控制程序集的加载,并指定使用FileShare.Delete打开该程序集,则应该可以对其进行重命名。现有过程将继续引用重命名的程序集。

/programming/7147577/programmatically-rename-open-file-on-windows


2
以我的经验,在大多数情况下(无论如何,超过一半的时间),您可以重命名(但不能删除)DLL,而无需修改应用程序。
哈里·约翰斯顿

@HarryJohnston:是的,即使正在使用.dll,我似乎也可以重命名。我想我将从现在开始。

1

不,很遗憾,这是不可能的。

抱歉,确切地说,除非进行后期绑定,否则表示该应用在该dll中运行部分代码时会使用该dll,但仍不可靠。


1

您可以查看asp.net托管过程的工作原理并开发类似的东西。

它获取整个Web应用程序并将其移动到实际加载该应用程序的临时位置。然后,它留下一个过程来监视原始文件夹中的更改,当检测到该过程时,它将在新的临时位置启动该应用程序的新实例,并开始将新请求重定向到该应用程序。一旦待处理的请求完成,旧应用便被拆除。

(挑剔,是的,它是事物的简化视图,在大多数情况下,IIS将请求排队直到新应用程序能够接管为止)



0

NSIS安装程序有一个选项,例如“计算机重新启动时移至温度”,“操作系统”将某些文件标记为在下次启动时移至其他位置,在下次计算机启动时,这些标记的文件会自动移至您先前选择的新位置。对此进行一些搜索将使您对此感到满意。


您可以在答复中提供完整的答案,而不是告诉OP寻找解决方案。他不会在这里问他是否已经找到解决方案。谢谢。
约翰aka hot2use
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.