2010-07-27 64 views
0

我已經加載了一個特定的AppDomain,我想從它動態地加載一些類型(小菜一碟吧?)。問題在於AppDomain類的所有CreateInstance方法都將其作爲遠程對象句柄返回。遠程代理有一些限制,我想避免這種情況,例如:必須擁有可序列化的具體類以及通過緊急垃圾回收,除非使用LifeTimeService。.net - 從AppDomain動態加載類型而無需遠程代理

我的問題是我怎麼能加載一個類型在另一個應用程序域中,而沒有它包裹在遠程代理?以下是我的代碼片段。

AppDomainSetup ads = new AppDomainSetup(); 
ads.ApplicationBase = Path.GetDirectoryName(_bllAssemblyPath); 
ads.PrivateBinPath = Path.GetDirectoryName(_bllAssemblyPath); 
if (File.Exists(_bllAssemblyPath + ".config")) 
    ads.ConfigurationFile = _bllAssemblyPath + ".config"; 
_workerSpace= AppDomain.CreateDomain("worker", new System.Security.Policy.Evidence(AppDomain.CurrentDomain.Evidence), ads); 

_bllQueue = _workerSpace.CreateInstanceFrom(_bllAssemblyPath, queueType) as IThumbCapQueue; 
+0

我不認爲你可以這樣做。你試圖做什麼,需要你在一個單獨的AppDomain中創建對象? – 2010-07-27 23:07:26

+0

我正在構建一個Windows服務,我希望_bllQueue被託管在與主服務內存空間分離的內存空間中。 – James 2010-07-27 23:10:39

回答

1

你總是需要某種類型的代理應用程序域之間的談話作爲.NET不會讓你直接訪問對象的內存在另一個應用程序域。另請注意,您的示例中的兩個AppDomain都將在相同的Windows進程中運行。

有一個新的遠程處理基礎設施:RIA Services可能會給你想要的功能。

+0

+ 1個不錯的答案。 – James 2010-07-27 23:42:19

0

而不是讓你對遠程感興趣的對象,做一個遠程「引導程序」,作爲遠程​​AppDomain的通信渠道,並用它來加載你感興趣的東西。我正在做這個在一個需要反映任意.NET dll從它們獲取類型信息的項目上(我在一個新的AppDomain中執行它,因爲當我完成後我想卸載程序集以便文件不鎖定) - 遠程處理Shim加載程序集,進行反射,收集必要的信息並以可序列化對象的形式將其發送回調用AppDomain。見here

+0

我實際上只希望從磁盤加載的動態具體實例不是序列化或遠程的。 – James 2010-07-27 23:44:52

+0

該模式仍然成立。無論您做什麼,您都需要通過遠程代理與輔助AppDomain進行通信,以便您可以對遠程感興趣的類型進行遠程處理,也可以進行遠程處理。 – nlawalker 2010-07-28 05:09:04

+0

什麼是遙控墊片? – James 2010-07-28 17:16:25