2012-09-17 84 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