2013-05-28 44 views
2

因此,我試圖從我的 Thread.GetDomain().GetAssemblies() 區域中刪除程序集。從應用程序域中刪除程序集

到目前爲止,我已經在網上看了幾個解釋,但一直沒能弄清楚。

這是我到目前爲止已經得到

AppDomain tempD = Thread.GetDomain(); 
tempD.DoCallBack(LoaderCallback); 
AppDomain.Unload(tempD); 
System.IO.File.Delete(assemblyName); 

private static void LoaderCallback() 
{ 
    Assembly.ReflectionOnlyLoad("myAssembly"); 

    //byte[] raw = System.IO.File.ReadAllBytes(test); 
    //Assembly yacsi = Assembly.Load(raw); 
    //((IScript)yacsi.CreateInstance("Script")).Go(); 
} 

我身邊這個概念迄今播放,但我努力使連接,因爲Thread.GetDomain();不包含Unload命令

此外,我無法嘗試這部分((IScript)yacsi.CreateInstance("Script")).Go(),因爲我不知道什麼程序集IScript是,也不是什麼放置在「腳本」文本部分

任何想法,將不勝感激

+3

沒有線程域這樣的東西。從MSDN:*無法卸載單個程序集而不卸載所有包含它的應用程序域。使用AppDomain中的Unload方法卸載應用程序域。有關詳細信息,請參閱卸載應用程序域。(http://msdn.microsoft.com/en-us/library/c5b8a8f9(v = vs80).aspx)* –

回答

2

要添加@ RobertHarvey的評論頂部,並退後一步,你想要做的是創建一個單獨的AppDomain並加載你的程序集到它。 之後,你可以編組到你的域名,你打算使用的各種類型。

當你完成它們時,你可以卸載應用程序域,從而擺脫程序集。

您應該注意,域間實例封送處理是通過.NET Remoting完成的,因此您可能需要使用remoting lease policies,其中包括編組對象生存期的時間值。修改租約期限的原因是,如果一個封送處理的實例沒有被調用/使用,它會在一段預定的時間後過期。因此,您可能希望避免一遍又一遍地重新編組實例,並延長您的域的使用壽命。

我想this is a good sample顯示如何將程序集加載到新的AppDomain並卸載它。那裏有很多其他樣品。

只要你知道過程應該是什麼,爲它找到代碼很簡單。