我很难弄清楚我的AppDomain.Unload(...)电话有什么问题。我有一个详细的解释,代码来自my earlier question。结果,我做了几个很明显,我不需要做的步骤。但是,我相当肯定的是,当创建AppDomain并将其保存在集合中时:
private static Dictionary<string , AppDomain> HostDomains;
void StartNewDomain(string domainName)
{
AppDomain domain = AppDomain.CreateDomain(domainName);
HostDomains[domainName] = domain;
}...when您完成了它,您必须卸载它:
if (HostDomains.ContainsKey(domainName))
{
AppDomain.Unload(HostDomains[domainName]);
HostDomains.Remove(domainName);
}然后从集合中删除域。
但是,当我卸载域时,整个应用程序将结束。如果我删除了卸载,那么全部是well...and,我们只剩下从集合中删除域了。但我担心我的孩子AppDomain并没有真正卸载。我想这最终可能会让我发呆,但这并不能给我一个温暖的模糊。
子AppDomain程序集( Windows应用程序)是通过继承MarshalByRefObject的适配器类中引用的接口(IModule)异步启动的。我想知道这个对IModule的Start() (插件模块程序集实现的)的引用是否没有正确地封送(因为我的实现)。因此,当调用关闭()方法时,整个应用程序就会死掉。我应该让我的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);...my担心的是,由于IModule是一个接口,即使在子域中创建实例,程序集也会泄漏到我的主AppDomain中。因此,当我试图卸载子域时,两个域都将被卸载。这是对的吗?通过MBR (适配器)对象提供Start() & Stop()方法的最佳解决方案可能是什么?
更新:如有更改,请参阅下面的答案--
好吧,没有泄漏--一切都继承了MBR:
新的AppDomain
)
我还做错什么了吗?我尝试过几件事,但它似乎是错误的或不完整的。当我告诉ModuleAdapter关闭时,它会调用AppDomain.Unload(AppDomain.CurrentDomain),主机域也会停止。在应用程序退出时,我仍然得到一些第一次机会异常。但是表单(myForm)已经被告知.Close()。
所以,我仍然在寻找正确的方法.
发布于 2010-02-19 19:45:59
正如我所怀疑的,在主域中使用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。
https://stackoverflow.com/questions/2294474
复制相似问题