2010-03-04 72 views
5

最近,我花了相當一段時間來編寫各種Visual Studio擴展項目。即使項目都是託管代碼來訪問核心VS服務,仍然需要使用舊式COM接口。COM互操作引用計數準則

下面是一個例子:

var selectionTracker = (IVsMonitorSelection)serviceProvider.GetService(typeof(SVsShellMonitorSelection)); 
IntPtr ppHier; 
uint pitemid; 
IVsMultiItemSelect ppMIS; 
IntPtr ppSC; 
selectionTracker.GetCurrentSelection(out ppHier, out pitemid, out ppMIS, out ppSC))) 

,你可以看到這個調用返回2個指針(ppHier和PPSC)和對象ppMIS。 現在的問題是:我應該如何去玩與COM引用計數很好。

這是我的理解,在COM世界中,當一個方法返回一個指向對象的指針時,這個指針在返回之前被AddRef'ed。這意味着要防止COM對象泄漏,我必須在完成使用後釋放它們。

我還假設我得到的是一個對象,它已經被包裝到一個RCW中,它將在完成時處理引用釋放。

這兩個適用於上述調用的假設意味着我必須確保在我的2個指針上調用`Marshal.Release',但對於返回的對象,我不應該做任何關於引用計數的操作。

爲了更改我的問題:假設我使用的COM對象是通過COM規則播放的,上述處理COM引用計數的正確方法的方法是什麼?

回答

0

在這個特殊的情況下,需要調用Marshal.ReleaseIntPtr的變量,否則他們就不會消失。當然,如果您告訴編組人員直接使用對象(或特定類型),那麼您不需要擔心它,因爲RCW將確保該對象在將來的某個時刻被銷燬(即,當終結器被調用時垃圾收集過程)。

當然終結方法可能發生在某個時間不確定性的點,所以如果該對象保持一定的資源,你需要擺脫你應該理想地調用Marshal.ReleaseComObject的包裝之前減少它的引用計數爲你釋放。