簡體   English   中英

如何使用c#卸載.dll?

[英]How to unload the .dll using c#?

我正在使用.dll引用我的應用程序。 我想在按鈕單擊事件中卸載.dll。 怎么做 ???

您無法卸載單個程序集 - 您必須卸載整個AppDomain 換句話說,您需要在新的AppDomain加載其他程序集(和相關代碼),然后當您要卸載它時卸載AppDomain

當然,這會讓生活變得更加困難,因為你不得不擔心在AppDomains之間調度調用 - 但這只是.NET所允許的。

正如Jon Skeet所寫,您無法卸載DLL,但您可以在另一個AppDomain中加載DLL - 然后卸載AppDomain。 這是唯一的方法。

然而,有些事情你需要變化,因為你自然必須在AppDomain上調用函數。 這可以通過兩種不同的方式發生。

如果您來自一個AppDomain(讓我們稱之為A),獲取對在AppDomain B中實例化的對象的引用,則默認行為是該對象跨AppDomain邊界序列化。 這意味着A訪問的對象實例與B訪問的實例不同,並且在A中進行的修改不會反映在B中,除非您提供向對象發送的功能。 這要求對象標記為Serializable。

但是,您可以通過讓類繼承MarshalByRefObject來避免序列化。 如果對象是在AppDomain B中構造的,並且從AppDomain A調用,則調用將跨越AppDomain邊界。 它仍然是相同的物理線程,因此您沒有像跨進程調用或COM跨公寓調用那樣擁有線程切換的開銷。

但是如果在B中構造一個由A中的對象引用的對象,但是B中的對象不會被訪問5分鍾,則該對象將被釋放。 可以在MarshalByRefObject.InitializeLifetimeService()中重寫此行為。

另請參閱實現不帶AppDomains的.NET插件的答案。 請注意評論中的討論,他們指出它會非常緩慢地泄漏內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM