首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AppDomain卸载杀死父AppDomain

AppDomain卸载杀死父AppDomain
EN

Stack Overflow用户
提问于 2010-02-19 06:25:58
回答 1查看 4.3K关注 0票数 8

我很难弄清楚我的AppDomain.Unload(...)电话有什么问题。我有一个详细的解释,代码来自my earlier question。结果,我做了几个很明显,我不需要做的步骤。但是,我相当肯定的是,当创建AppDomain并将其保存在集合中时:

代码语言:javascript
复制
private static Dictionary<string , AppDomain> HostDomains;

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

...when您完成了它,您必须卸载它:

代码语言:javascript
复制
if (HostDomains.ContainsKey(domainName))
{
    AppDomain.Unload(HostDomains[domainName]);
    HostDomains.Remove(domainName);
}

然后从集合中删除域。

但是,当我卸载域时,整个应用程序将结束。如果我删除了卸载,那么全部是well...and,我们只剩下从集合中删除域了。但我担心我的孩子AppDomain并没有真正卸载。我想这最终可能会让我发呆,但这并不能给我一个温暖的模糊。

子AppDomain程序集( Windows应用程序)是通过继承MarshalByRefObject的适配器类中引用的接口(IModule)异步启动的。我想知道这个对IModule的Start() (插件模块程序集实现的)的引用是否没有正确地封送(因为我的实现)。因此,当调用关闭()方法时,整个应用程序就会死掉。我应该让我的IModule成为一个抽象类,这样它也应该继承MBR吗?困惑..。

在看了我的代码之后:

代码语言:javascript
复制
// 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);

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

更新:如有更改,请参阅下面的答案--

好吧,没有泄漏--一切都继承了MBR:

新的AppDomain

  • ModuleAdapter : MarshalByRefObject中的ModuleAdapter实例-- IModule接口、接口方法(Start,Stop)

  • MyModulePlugin : MarshalByRefObject - Application.Run(myForm)

)

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-02-19 19:45:59

正如我所怀疑的,在主域中使用IModule接口会导致泄漏。为了适当地做到这一点:

代码语言:javascript
复制
AppDomain domain = AppDomain.CreateDomain(domainName);
HostDomains[domainName] = domain;  // put in collection

ModuleAdapter adapter = (ModuleAdapter)domain.CreateInstanceAndUnwrap(asmName , typeName);

ModuleAdapter继承MarshalByRefObject的地方。然后:

代码语言:javascript
复制
adapter.Execute(moduleAssembly , moduleType);

在ModuleAdapter类中:

代码语言:javascript
复制
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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2294474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档