我已经构建了一个后端,以便将业务逻辑放在运行时加载的dll中。使用ShadowCopyFiles = true和文件系统监控,我可以在不重新启动主机进程的情况下修改业务逻辑。
到目前为止一直很好......
让我们调用主机appdomain A和其中一个孩子B.
不幸的是,如果我在由B而不是A引用的程序集C中进行更改,则在重新加载B时不会反映这些更改。我认为这是因为A加载C本身。我必须采取哪些步骤来阻止A加载C?
这是A用来加载B的代码:
AppDomainSetup appDomainSetup = new AppDomainSetup();
appDomainSetup.CachePath = ServiceDLLPath + @"\Shadow";
appDomainSetup.ShadowCopyFiles = "true";
ad = AppDomain.CreateDomain(assemblyName, null, appDomainSetup);
ad.InitializeLifetimeService();
try
{
service = (IService)ad.CreateInstanceFromAndUnwrap(assemblyName,
"AppName.Services." + typeName);
service.Start();
}
catch (Exception e)
{
LogManager.Log("AppDomain load failed: " + e.Message);
return false;
}
答案 0 :(得分:0)
如果A
引用C
且A
是'主机',则无法在不停止并重新启动该进程的情况下重新加载C
。
一种可能性是创建一个非常薄的填充程序AppDomain来引导A
AppDomain(并且可以重新启动它),但是重新设置该进程可能会有相同的性能配置文件。
另一种(看似更健全)的方法是使A
和它的依赖关系独立于C
使用的方法,并且对于重叠的程序集,只需使它们足够稳定,你不需要经常改变它们。
答案 1 :(得分:0)
好的,我通过创建一个'界面来解决这个问题。组装
因此,如果此程序集被称为X,则链现在是:
A - > X< -B - > ç
(最初:A - > B - > C)
我现在可以在B或C中进行更改,当appDomain B被A销毁并重新启动时会反映出来。
编辑,按照蒂姆的要求,提供更多细节。
appdomain A中的代码没有改变,你可以看到我的问题。唯一需要注意的是IService类型定义的位置:
service = (IService)ad.CreateInstanceFromAndUnwrap(assemblyName,
"AppName.Services." + typeName);
一旦IService转移到专门构建的程序集,我就能够删除B和A中的引用,这些引用在某种程度上最终将A连接到C.基本上Chris所说的一切都是正确的,它就是它& #39;并不总是清楚路径是什么。
答案 2 :(得分:0)
阅读答案和评论,听起来你最好将业务逻辑包装到WCF服务中。您可以使用网络管道来最小化在同一台PC上运行的开销。您还应该查看MEF以构建应用程序可扩展性。不幸的是,MEF的设计还不允许您在不重新启动主机应用程序的情况下即时卸载和替换插件