2012-04-16 102 views
5

我有一個c#com類被umamaged代碼使用。我可以調試它,但我不知道對象何時被釋放。如果已經在C++中實現了,則會調用descructur,在C#中它將被釋放給GC。有什麼方法可以跟蹤那個時刻嗎? 在此先感謝。com對象c#的跟蹤版本。

+0

您是否正在尋找終結器? – SLaks 2012-04-16 18:43:09

+0

只是好奇,你可以在這種情況下使用C#[析構函數](http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx)? – 2012-04-16 18:44:03

+0

這裏沒有快樂的答案。你的[ComVisible]類實例是一個普通的舊.NET對象。它通過CCW的參考文獻保存下來。最後的Release()調用破壞了CCW,但是.NET對象沒有任何反應。直到它像正常收集垃圾。您需要調試本機代碼。無論如何,這個問題無疑是無疑的。 – 2012-04-16 19:58:24

回答

1

維護非託管資源的託管類型應實現IDisposable接口。這告訴消費者您的代碼需要在對象的實例上調用Dispose()(即在可能的情況下將它們包裝在using塊中)。

IDisposable的正確實現將釋放其終結器中的本地資源,但客戶端可以比確定性釋放非託管資源更早地調用Dispose()。無論哪種方式,您都可以避免泄漏,但最好儘快撥打Dispose()

Here is an SO question其中詳述了該過程。

+0

問題是我無法控制非託管代碼。 GC沒有任何必要的清理工作。我只想知道我的對象的預期壽命是多少。 – user629926 2012-04-16 18:51:15

+0

如果你不能控制本地代碼,那麼我不明白這個問題。託管代碼無法清除本地代碼,除非本地代碼定義了一個接口來執行此操作。 GC照顧你的託管包裝是無關緊要的;它不只是神奇地清理本地的東西。你必須通過實現IDisposable並在本地資源上調用一些函數來釋放它。 – 2012-04-16 18:59:58

+0

我沒有任何本機資源進行清理,只是想知道什麼時候管理整理器實現。 – user629926 2012-04-16 19:08:01