0

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

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

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

4

2 回答 2

1

根据 MSDN:

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

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

我的方法可能涉及通信层和业务逻辑之间的某种本地通信,每个都在不同的上下文(AppDomain)上 - 例如通过命名管道内存映射文件

于 2013-11-14T13:50:34.167 回答
0

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

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

请注意速度,因为 MethodInfo.Invoke 很慢,您可能需要考虑使用 DynamicMethod。创建/销毁应用程序域也很慢。

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

您也可以使用所谓的“插件”框架。Codeplex 有一个称为 MEF“托管可扩展性框架”

http://mef.codeplex.com/

于 2013-11-14T19:06:17.003 回答