我无法找到关于AppDomain.Unload(...)
电话的内容。我对my earlier question的代码进行了详细解释。事实证明,我执行了几个步骤,显然,我不需要。但是,我很确定在创建AppDomain并将其保存在集合中时:
private static Dictionary<string , AppDomain> 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窗体应用程序)通过我的适配器类中引用的继承MarshalByRefObject
的接口(IModule)异步启动。我想知道这个对IModule的Start()(插件模块程序集实现的)的引用是不是正确编组(因为我的实现)。因此,当调用Shutdown()方法时,整个应用程序都会死掉。我应该使我的IModule成为一个抽象类,所以它应该继承MBR吗?不解...
看了我的代码后:
// 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中。因此,当我尝试卸载子域时,两个域都被卸载。这是正确的吗?什么可能是提供Start()&amp; amp;的最佳解决方案。通过MBR(适配器)对象的Stop()方法?
更新:请参阅下面的答案以了解更改 -
好吧,没有泄漏 - 一切都继承了MBR:
我还做错了吗?我尝试了几件事情,但这似乎是错误的或不完整的。当我告诉ModuleAdapter关闭时,它会调用AppDomain.Unload(AppDomain.CurrentDomain)
并且主机域也会停止。我仍然在应用程序退出时获得一些第一次机会异常。但是形式(myForm)被告知.Close()。
所以,我仍然在寻找正确的方法......
答案 0 :(得分:1)
正如我所怀疑的那样,在主域中使用IModule接口进行实例化会导致泄漏。为了做到这一点:
AppDomain domain = AppDomain.CreateDomain(domainName);
HostDomains[domainName] = domain; // put in collection
ModuleAdapter adapter = (ModuleAdapter)domain.CreateInstanceAndUnwrap(asmName , typeName);
ModuleAdapter继承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。