我想在不停止服务的情况下更新服务器进程的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
IIS没有在内存中保存一个未被使用的DLL( 受到Cache属性的影响 ),而且我假设ASP.NET也是如此。 如果你遵循相同的策略,你也可以更新你的dll。
但是,如果你正在使用你的DLL,你应该有办法告诉你的服务器进程卸载所有的DLL。
要发生这种情况,服务器进程必须使用LoadLibrary调用加载所有的DLLS,以便在接收到要求这样做的通信时卸载它们。
与服务器进程的通信可以通过创建一个全局可用的命名事件来完成,该事件可以被新程序访问,并用来指示正在发生更新的正在运行的进程。 (你也可以考虑做这个的其他变化)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。