我有我使用的模塊加載到一個沙箱一個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突然不知道它的程序集? 垃圾數據來自哪裏? 我能做些什麼來防止這兩種情況發生?
我看了看,並沒有被使用,除了那些可能成爲下的遠程代理使用的任何串行 - 那些不是我的。即使我找到了一個,但我仍然不會購買這個解釋,爲什麼我的AppDomain會遭到破壞。 – 2010-06-24 13:25:59
如果您使用編譯的正則表達式,您還會得到奇怪的命名程序集。 – Sean 2013-06-10 14:14:28