2012-12-08 212 views
0

我發現了很多類似的問題,但找不到任何解決方案。引發AppDomain異常

我有以下代碼:

string file = "c:\\abc.dll"; 
    AppDomainSetup ads = new AppDomainSetup(); 
    ads.PrivateBinPath = Path.GetDirectoryName(file); 
    AppDomain ad2 = AppDomain.CreateDomain("AD2", null, ads); 
    ProxyDomain proxy = (ProxyDomain)ad2.CreateInstanceAndUnwrap(typeof(ProxyDomain).Assembly.FullName, typeof(ProxyDomain).FullName); 

Assembly asm = proxy.GetAssembly(file); // exception File.IO assembly not found is thrown here after succesfully running the funktion GetAssembly. 


    public class ProxyDomain : MarshalByRefObject 
    { 
    public Assembly GetAssembly(string assemblyPath) 
    { 
     try 
     { 
      Assembly asm = Assembly.LoadFile(assemblyPath); 
      //...asm is initialized correctly, I can see everything with debugger 
      return asm; 
     } 
     catch 
     { 
      return null; 
     } 
    } 
    } 

是那麼我GetAssembly的Funktion返回一些其他類型的,甚至是我的自定義序列化類最有趣的事情,一切都很好。有人知道我錯過了什麼嗎?或者只是不可能將加載的程序集返回到另一個域?

謝謝

+2

你爲什麼試圖返回一個'Assembly'到父應用程序域?通常,這將被避免,所以父應用程序域不必加載程序集,並且可以在卸載子應用程序域時卸載它。 –

+0

如果你用這個ProxyDomain類來解釋你想要達到的目標,這將有所幫助。爲什麼你需要一個新的AppDomain如果你要返回完整的程序集到你的主域? –

+0

那麼,我真的不需要在我的第一個應用程序域中的這個程序集。我在文件夾中有很多它們,我必須找到包含特殊類屬性的程序集並返回一個dll名稱列表。我需要第二個應用程序域,因爲在應用程序重新啓動之前,無法刪除在主AppDomain中加載的所有程序集。我解決了我的問題,但仍然知道爲什麼它會返回所有其他類型,並且無法返回Assembly。 – VladL

回答

0

我想象File.IO坐在主應用程序的bin目錄?如果是這樣,你的abc.dll將不知道在哪裏找到它(除非你的主應用程序也坐在C:\\)。

你需要做的

  1. Bind一到AppDomain.AssemblyResolve事件和手動加載引用的DLL
  2. 更改AppDomainSetup的基本目錄(這是.NET知道如何尋找的dll的地方之一)
  3. 安裝File.IOGAC(這是.NET知道如何尋找的dll的位置)
  4. 廣告的另一個d File.IO的位置到您的AppDomainSetup的私人探測路徑(這是.NET將嘗試查找dll的另一個地方)。
+0

File.IO是一個異常類型。 abc.dll不在同一個目錄下,程序被執行。正如我所說,每一個返回類型的作品,只是大會不 – VladL

+0

該事件沒有發現任何事件和基礎知識沒有改變的東西 – VladL

+0

@ VladL,沒有「File.IO」在.Net中的異常類型 - 所有異常類型在名稱中都有「Exception」。你確定你複製粘貼的異常類型/文本正確嗎? –