AppDomain卸载杀死父AppDomain

我无法弄清楚我的AppDomain.Unload(...)调用。 我从前面的问题中得到了代码的详细解释。 事实certificate,我执行了几个步骤,显然,我不需要。 但是,我很确定在创建AppDomain并将其保存在集合中时:

 private static Dictionary HostDomains; void StartNewDomain(string domainName) { AppDomain domain = AppDomain.CreateDomain(domainName); HostDomains[domainName] = domain; } 

……当你完成它之后,你必须卸载它:

 if (HostDomains.ContainsKey(domainName)) { AppDomain.Unload(HostDomains[domainName]); HostDomains.Remove(domainName); } 

然后从集合中删除域。

但是,当我卸载域时,整个应用程序正在结束。 如果我删除卸载,一切都很好……我们只是从集合中删除域。 但我担心我的孩子AppDomain并没有真正卸载。 它可能最终得到GC我猜,但这并没有给我一个温暖的模糊。

子AppDomain程序集(Windows窗体应用程序)通过我的适配器类中引用的接口(IModule)异步启动,该接口inheritanceMarshalByRefObject 。 我想知道这个对IModule的Start()(插件模块程序集实现的)的引用是不是正确编组(因为我的实现)。 因此,当调用Shutdown()方法时,整个应用程序都会死掉。 我应该让我的IModule成为一个抽象类,所以它应该inheritanceMBR吗? 困惑…

看了我的代码后:

 // instances the module for access to the module's Start() method IModule module = (IModule)domain.CreateInstanceAndUnwrap( ModuleManager.Modules[modName].Name, ModuleManager.Modules[modName].EntryPoint.FullName); 

…我担心,因为IModule是一个接口,即使我在子域中创建一个实例,程序集也会泄漏到我的主AppDomain中。 因此,当我尝试卸载子域时,两个域都被卸载。 这是正确的吗? 什么可能是通过MBR(适配器)对象提供Start()和Stop()方法的最佳解决方案?

更新:请参阅下面的答案 – 更改 –
好的,没有泄漏 – 一切都inheritance了MBR:

  1. 主机:MarshalByRefObject – 在新的AppDomain中实例化ModuleAdapter
  2. ModuleAdapter:MarshalByRefObject – IModule接口,接口方法(Start,Stop)
  3. MyModulePlugin:MarshalByRefObject – Application.Run(myForm)

我还做错了吗? 我尝试了几件事情,似乎是错误的或不完整的。 当我告诉ModuleAdapter关闭时,它会调用AppDomain.Unload(AppDomain.CurrentDomain) ,Host域也会停止。 我仍然在应用程序退出时获得一些第一次机会exception。 但是forms(myForm)已被告知.Close()。

所以,我仍然在寻找正确的方法……

我怀疑,在主域中使用IModule接口进行实例化会导致泄漏。 为了做到这一点:

 AppDomain domain = AppDomain.CreateDomain(domainName); HostDomains[domainName] = domain; // put in collection ModuleAdapter adapter = (ModuleAdapter)domain.CreateInstanceAndUnwrap(asmName , typeName); 

其中ModuleAdapterinheritance了MarshalByRefObject 。 然后:

 adapter.Execute(moduleAssembly , moduleType); 

在ModuleAdapter类中:

 public void Execute(string Name, string EntryPoint) { module = (IModule)AppDomain.CurrentDomain.CreateInstanceAndUnwrap(Name , EntryPoint); } 

我欢迎您提出更好的评论或其他答案。

在将实例移动到ModuleAdapter类之后,我们仍然遇到AppDomain.Unload的问题,导致整个应用程序被终止。 我想知道这是否是因为在模块插件中我们使用Application.Run(myForm) – 然后当我们关闭时,我们调用myForm.Close()。 显然这会关闭应用程序,所以我想知道myForm.Close()是否也“卸载”了AppDomain。