最近,我花了相當一段時間來編寫各種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引用計數的正確方法的方法是什麼?