【问题标题】:Update a dll without stopping the service在不停止服务的情况下更新 dll
【发布时间】:2008-10-22 16:30:51
【问题描述】:

我想在不停止服务的情况下更新服务器进程的 dll。我怎么做? 有点像 asp.net 如何自动拾取放在 bin 文件夹中的新 dll。

【问题讨论】:

  • 您的服务是用什么环境/语言编写的?在解决此问题时,Win32 和 .NET 之间存在巨大差异......
  • 请注意,虽然 asp.net 似乎继续运行,但当将新的 dll 放入 bin 文件夹时,用户活动仍会中断并导致工作丢失。

标签: .net windows dll windows-services


【解决方案1】:

Asp.Net 使用一种称为shadow copy的技术

如果您将更新的 dll 复制到应用程序的 bin 子目录中,ASP.NET 运行时会识别出有新代码要执行。由于 ASP.NET 无法将 dll 交换到现有的 AppDomain 中,因此它会启动一个新的 AppDomain。旧的应用程序域是“停止排水”,即允许现有请求完成执行,一旦它们全部完成,AppDomain 就可以卸载。新的 AppDomain 以新代码开始并开始接受所有新请求。

通常,当 dll 加载到进程中时,进程会锁定 dll,您无法覆盖磁盘上的文件。但是,AppDomains 有一个称为 Shadow Copy 的功能,它允许程序集在磁盘上保持解锁和可替换状态。

运行时初始化 ASP.NET,并为 bin 目录启用卷影复制。 AppDomain 会将它需要的任何 dll 从 bin 目录复制到一个临时位置,然后再将 dll 锁定并加载到内存中。 Shadow Copy 允许我们在更新期间覆盖 bin 目录中的任何 dll,而无需使 Web 应用程序脱机。

【讨论】:

【解决方案2】:

除了Gulzar的回答:

如果您的服务只是直接引用 DLL,您需要重新设计服务以利用 AppDomains 和 ShadowCopy 功能来利用此功能。

我们在服务只是一个外壳/主机进程的情况下做这样的事情。所有功能都在需要时加载到单独的应用程序域中。

http://blogs.msdn.com/junfeng/archive/2004/02/09/69919.aspx

【讨论】:

    【解决方案3】:

    当进程加载了一个 dll 后,就无法更改它。

    IIS 在不使用时不会将 DLL 加载到内存中 (affected by the Cache property),我假设 ASP.NET 也是如此。如果您遵循相同的策略,您也可以更新您的 dll。

    但是,如果您的 dll 正在被使用,您应该有办法告诉您的服务器进程卸载所有的 dll。

    为此,服务器进程必须使用 LoadLibrary 调用加载所有 DLLS,以便在收到要求它这样做的通信时卸载它们。

    与服务器进程的通信可以通过创建一个全局可用的命名事件来完成,新程序可以访问该事件并用于向正在运行的进程发出更新即将发生的信号。 (您也可以考虑这样做的其他变体。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多