在运行的实例上动态更新dll

时间:2013-11-14 13:46:10

标签: c# dll service

我们运行的服务通过TCP连接数百台设备。每次我们想要更新此服务时,我们都需要重新启动它,这会导致所有设备的连接丢失。

为了防止这种情况,我们希望将应用程序划分为连接部分和业务逻辑/数据层部分。这将为我们提供更新业务逻辑/数据层而无需重新启动连接部分的选项。这可以通过WCF服务来完成,但是系统应该尽可能快地响应并且引入另一个连接到某些东西将导致额外的延迟。

是否可以在不重新启动应用程序的情况下更新dll文件并向应用程序发出指令,以便它将加载新的dll并释放旧的dll?当然只要层之间的接口不会中断。

2 个答案:

答案 0 :(得分:1)

根据MSDN:

“如果不卸载包含它的所有应用程序域,就无法卸载单个程序集。即使程序集超出范围,实际的程序集文件仍将保持加载状态,直到卸载包含它的所有应用程序域。 “

参考:http://msdn.microsoft.com/en-us/library/ms173101(v=vs.90).aspx

我的方法可能涉及通信层和业务逻辑之间的某种本地通信,每个通信都在不同的上下文(AppDomain)上 - 例如通过named pipesmemory mapped files

答案 1 :(得分:0)

这是动态加载/卸载程序集的一个很好的例子。

http://www.c-sharpcorner.com/uploadfile/girish.nehte/how-to-unload-an-assembly-loaded-dynamically-using-reflection/

请注意速度,因为您可能希望使用DynamicMethod调查MethodInfo.Invoke。创建/销毁应用程序域也很慢。

http://www.wintellect.com/blogs/krome/getting-to-know-dynamicmethod

您也可以使用所谓的“插件”框架。 Codeplex有一个名为MEF“Managed Extensibility Framework”

http://mef.codeplex.com/