2014-09-03 93 views
1

我有一箇舊的VB6項目,我打電話給我創建的.Net庫。 我仍然在這個DLL的單元測試階段,所以問題是,每次我更新我的DLL,並讓運行的VB6應用程序識別它,我不得不關閉應用程序來替換舊的DLL版本新的一個。所以我認爲dll在第一次調用時被加載到內存中,直到我退出應用程序調用它纔會被釋放。 反正有沒有從VB6應用程序中釋放DLL?如何從內存中釋放在VB6應用程序中調用的.Net DLL?

+3

部署總是很有趣; VB6不*具有在進程內隔離的好功能(對比:.NET中的'AppDomain');我看不到這個工作... – 2014-09-03 08:39:47

+2

你可能會浪費數週試圖讓這個工作。只需關閉應用程序並重新啓動它。 – MarkJ 2014-09-03 11:01:13

回答

5

COM支持卸載不再使用的服務器。基礎API調用是服務器中的CoFreeUnusedLibraries()和DllCanUnloadNow()入口點,由COM基礎結構自動調用。發生這種情況的確切時間通常是不可預知的,如果您想根據需要替換DLL,應該已經成爲掛斷。

但是這對[ComVisible] .NET程序集不起作用。由CLR施加的限制,.NET程序集只能在AppDomain被銷燬時卸載。第一次從.NET程序集創建對象時創建。在程序退出之前,AppDomain不會被銷燬,從而保持對DLL的鎖定。

這是技術上無論如何可能發生這種情況,您必須在一個程序集中公開一個墊片類,以將調用轉發給在另一個程序集中實現的另一個類。你加載到另一個AppDomain中。相當痛苦,因爲需要的appdomain邊界編組而緩慢。一個重要的掛斷是你不能得到一個很好的信號來銷燬該AppDomain。您必須使用您公開的客戶端代碼可以調用的方法來明確它。一個進程外服務器將是另一種方法,在.NET中也很慢並且很痛苦,它需要COM +託管ServicedComponent類。很多理由不是想要這個。

相關問題