微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

更新一个DLL而不停止服务

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

Environment.CurrentDirectory设置为system32; 我如何确定在哪里?

哪个.NET框架版本将被包含在Windows 7中?

DataGridView CellFormatting事件不会触发

在Windows XP,Vista和7上安装了什么版本的.NET框架?

MSDeploy是否需要.net 4?

Asp.Net使用了一种名为“ 影子副本”的技术

如果您将更新后的dll复制到应用程序的bin子目录中,则ASP.NET运行时会识别出要执行的新代码。 由于ASP.NET不能将dll交换到现有的AppDomain,所以它启动一个新的AppDomain。 旧的应用程序域是“排空停止”,也就是说,现有的请求被允许完成执行,一旦完成,AppDomain可以卸载。 新的AppDomain从新的代码开始,并开始采取所有新的请求。

通常,当一个DLL加载到进程中时,该进程会锁定该DLL,并且不能覆盖该磁盘上的文件。 但是,AppDomain具有一个称为“影复制”的功能,允许程序集在磁盘上保持解锁状态和可替换状态。

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

除了Gulzar的回答:

如果你的服务只是直接引用这个DLL,你需要重新设计这个服务来利用AppDomain和Shadowcopy功能来利用这个特性。

我们做这样的事情,这个服务只是一个shell / host进程。 所有功能都按需要加载到单独的应用程序域中。

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

一个进程已经加载了一个DLL是不可能改变它。

IIS没有在内存中保存一个未被使用的DLL( 受到Cache属性的影响 ),而且我假设ASP.NET也是如此。 如果你遵循相同的策略,你也可以更新你的dll。

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

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

与服务器进程的通信可以通过创建一个全局可用的命名事件来完成,该事件可以被新程序访问,并用来指示正在发生更新的正在运行的进程。 (你也可以考虑做这个的其他变化)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐