2010-06-23 32 views
4

我有我使用的模塊加載到一個沙箱一個AppDomain:爲什麼我的C#AppDomain罰一時,然後拋出異常呢?

class PluginLoader 
{ 
    public static AppDomain PluginSandbox; 

    static PluginLoader() 
    { 
     AppDomainSetup ads = new AppDomainSetup(); 
     ads.ApplicationName = "Plugin Modules"; 
     PermissionSet trustedLoadFromRemoteSourceGrantSet = 
        new PermissionSet(PermissionState.Unrestricted); 
     PluginSandbox = 
        AppDomain.CreateDomain("Plugin App Domain", 
        null, ads, trustedLoadFromRemoteSourceGrantSet); 
    } 

再後來,我就拉我需要的DLL,並創建一個對象實例:

 public IPlugin FindPlugin(string pluginName) 
    { 
      ObjectHandle handle = 
        PluginSandbox.CreateInstance(pluginName, 
         "Plugins." + pluginName); 
       IPlugin ip = (IPlugin)handle.Unwrap(); 
       return ip; 
    } 

我跑過這幾次沒有問題。在Sandbox中獲取各種對象的實例,沒有任何問題。

稍後在代碼中,在另一種方法中,我需要找到程序集以獲取嵌入式資源(使用ManifestResource編譯成數據文件)。所以,我呼籲:

 Assembly [] ar = PluginSandbox.GetAssemblies(); 

和錯誤被拋出:

A first chance exception of type 'System.IO.FileNotFoundException' 
occurred in PluginRunner.dll. 

Additional information: Could not load file or assembly '10wl4qso, 
Version=1.0.3826.25439, culture info=neutral, PublicKeyToken=null' 
or one of its dependencies. The system cannot find the file specified. 

我並不感到驚訝。 '10wl4qso'不是程序集的名稱,DLL或任何類似的名稱。事實上,每次運行似乎都是僞隨機的。此外,GetAssemblies的附加樂趣甚至沒有記錄引發此異常。

現在我可以打電話GetAssemblies後,我得到的初始對象就好了,一切都是桃色。但幾秒鐘後,我用另一種方法得到了這個結果。遠程訪問,PluginSandbox在調試器中根本沒有任何有用的信息。

我在AppDomain上捕獲UnhandledException和DomainUnload,並且都沒有被觸發。

爲什麼我的AppDomain突然不知道它的程序集? 垃圾數據來自哪裏? 我能做些什麼來防止這兩種情況發生?

回答

2

你看到的這個奇怪的命名的程序集可能是由XmlSerializer生成的。 XML序列化程序將輸出一個動態程序集,以便能夠快速序列化和反序列化特定類型。請檢查您的代碼是否使用XmlSerializer,將它們註釋掉並查看問題是否再次出現。

+0

我看了看,並沒有被使用,除了那些可能成爲下的遠程代理使用的任何串行 - 那些不是我的。即使我找到了一個,但我仍然不會購買這個解釋,爲什麼我的AppDomain會遭到破壞。 – 2010-06-24 13:25:59

+0

如果您使用編譯的正則表達式,您還會得到奇怪的命名程序集。 – Sean 2013-06-10 14:14:28

0

我不知道它是否對您有幫助... 嘗試覆蓋IPlugin上的InitializeLifeTimeService。你的IPlugin實現應該首先從MarshalByRefObject繼承。

public class PluginSample : MarshalByRefObject, IPlugin 
{ 

    public overrides object InitializeLifetimeService() 
    { 
     return null; //Return null to infinite object remote life. 
    } 
    //...implementation 

} 

看看這篇文章: RemotingException when raising events across AppDomains

相關問題