AppDomain.Unload内存泄漏

时间:2011-12-23 19:28:25

标签: .net memory-leaks appdomain

我的AppDomain中有类似的问题与本文中描述的内容

http://social.msdn.microsoft.com/Forums/en-AU/clr/thread/20de15d6-3111-4c2e-a04b-feb341a67ebc

任何人都可以详细说明解决方案,也许有一个例子,因为我迫切需要这个解决方案,但答案似乎对我来说有点混乱。

{
    AppDomain domain2 = AppDomain.CreateDomain("ADFHelper");  
    obj = domain2.CreateInstanceAndUnwrap ("Econ.Test", "Econ.Test.ADFHelper"); 
    object results = obj.GetType().InvokeMember("DoADFTest",System.Reflection.BindingFlags.InvokeMethod, Type.DefaultBinder, obj, new object[] {     ResArray.ToArray() }); 
    AppDomain.Unload(domain2);
}

2 个答案:

答案 0 :(得分:1)

线程中的代码错误地使用AppDomain.Load尝试在新域中加载程序集。实际上这实际上是在当前域中加载程序集。正如the documentation on MSDN所述(强调增加):

  

此方法仅用于将装配加载到当前   应用程序域。此方法是为了方便起见而提供的   无法调用静态Assembly.Load的互操作性调用者   方法。 要将程序集加载到其他应用程序域,请使用   CreateInstanceAndUnwrap。

等方法

解决方案如文档中所述 - 使用类似AppDomain.CreateInstanceAndUnwrap的内容在新应用域中加载类。如果您要加载的类是MarshalByRefObject并且您需要从当前应用程序域内部调用方法,这将是正确的方法。

如果您不想要MarshalByRefObject并且不需要触摸新加载的类(即您只想在新的应用程序域中加载类型并“保持独立”),可以使用AppDomain.CreateInstance,而不需要编组或远程处理。

答案 1 :(得分:0)

我不能给你一个编码的例子,因为它是导致问题的概念,而不是代码。

主要是,如果您将程序集加载到另一个AppDomain中,它也将被加载到当前的AppDomain中 - 这是必要的,以便能够访问其中的类型,从而对其执行某些操作。因此,在AppDomain.Unload()上,程序集仍将加载到您的调用AppDomain中。

您可以使用App http://msdn.microsoft.com/en-us/library/2xkww633%28v=VS.90%29.aspx中所述的AppDomain.CreateInstanceFrom方法解决此问题,因此您有2种方法可以避免此问题:

  • 使用反思
  • 使用界面访问其他AppDomain中的新对象 - 这两个AppDomain都必须知道此界面,通常您可以通过在两个AppDomains中加载包含该界面的小型程序集来实现此目的。