2013-04-12 31 views
0

我有一個遺留的COM組件,我試圖從.NET窗體應用程序中使用它。我使用aximp.exe爲非託管COM組件創建.NET包裝。然後我使用ISupportInitialize接口的BeginInitEndInit來創建COM類的一個實例。這工作正常。但是當我嘗試使用Marshal.ReleaseComObject銷燬對象時,未託管的C++ COM對象的析構函數沒有被調用。我也試過Marshal.FinalReleaseComObject,但仍然沒有調用析構函數。有人可以告訴我什麼是正確的方法嗎?銷燬.NET應用程序中的COM對象

+0

這可能意味着您有其他優秀的對象引用。你確定沒有嗎? –

+0

謝謝..但我如何找到其他參考? – Asha

+0

如果你擁有COM對象的實現(並且我猜你有你的系統,那麼析構函數從未被調用過),你可以監視AddRef/Release調用和引用計數。 –

回答

0

包裝將執行IDispose

WinForm類通常有一個組件集合和一個處理組件的Dispose方法。您可以將對象添加到組件集合中,並將它與表單一起處理。 (你甚至可以讓窗體設計器爲您生成的所有代碼。)

如果你想早做,只是調用對象Dispose(如在finally塊或者隱含通過using語句)。

+0

我只從Dispose調用FinalReleaseCOMObject。 。我手動調用從我的WinForm應用程序Dispos – Asha

+0

你應該讓aximp.exe和系統。它生成的System.Windows.Forms.AxHost派生包裝爲你工作。如果你使用的是Visual Studio或者equiv,讓WinForm設計器爲你的組件的生命週期生成代碼。就像向COM對象添加項目引用一樣簡單,將控件添加到WinForms工具箱並將其拖到窗體。這種方式更易於維護。如果您有特殊情況,請先嚐試這種方式,然後開發您的特殊情況。 –