2012-09-17 88 views
0

可能重复:
Unloading the Assembly loaded with Assembly.LoadFrom()为什么装配仍然可见?

我使用自定义AppDomain加载/卸载组件。但是当组装被卸载时,我可以在AppDomain.CurrentDomain下看到它。

这是怎么回事?这是正常的行为还是我错过了什么?

谢谢你的任何线索!

string assemblyPath = @"C:\MyFile.dll"; 
var assemblyName = AssemblyName.GetAssemblyName(assemblyPath); 

      var ads = new AppDomainSetup 
          { 
           ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase, 
           DisallowCodeDownload = true 
          }; 

      AppDomain newDomainName = AppDomain.CreateDomain("newDomainName", null, ads); 
       try 
       { 
        Assembly testLibrary = newDomainName.Load(assemblyName); 

        var c1 = AppDomain.CurrentDomain.GetAssemblies(); 

        var c2 = newDomainName.GetAssemblies(); 
       } 
       finally 
       { 
        AppDomain.Unload(newDomainName); 

        var c3 = AppDomain.CurrentDomain.GetAssemblies(); 

        // The assembly is still visible here!!! 
       } 
+0

@asawyer不,它不是一个重复的问题我使用一个新的AppDomain保持那里加载大会。 –

回答

4

要调用的应用程序域,它根据的Load()方法documentation:“应仅用于将一个组件加载到当前应用程序域这种方法被提供作为用于互操作性呼叫者谁不能调用方便静态Assembly.Load方法。要将程序集加载到其他应用程序域,请使用CreateInstanceAndUnwrap等方法。“

换句话说,你加载程序集到初级的AppDomain,因为你是从调用Load()主要的AppDomain(即使你使用调用它在你的中学的AppDomain的实例),这这就是为什么即使在卸载辅助AppDomain之后它仍然出现的原因。

如上述文档摘录中所示,您可能要使用AppDomain.CreateInstanceAndUnwrap

2

您无法从应用程序域中删除加载的程序集。

http://blogs.msdn.com/b/jasonz/archive/2004/05/31/145105.aspx

http://msdn.microsoft.com/en-us/library/ms173101(v=vs.80).aspx

没有办法卸载单个组件而不卸载包含它的应用程序的域的所有 。即使程序集 超出了范围,实际的程序集文件仍将保持加载状态,直到包含它的所有应用程序域都被卸载。

http://blogs.msdn.com/b/suzcook/archive/2003/07/08/unloading-an-assembly.aspx

有没有办法卸载单个程序集而不卸载包含它的应用程序域的所有 。

+0

但我卸载它AppDomain.Unload(newDomainName);告诉我,我哪里错了? –

+0

@Peretz铱星是正确的。您正在加载程序集不正确。 – asawyer