Ostatnio sporo czasu spędziłem na pisaniu różnych projektów Visual Studio Extensions. Mimo że wszystkie projekty są zarządzane, aby uzyskać dostęp do podstawowych usług VS, nadal trzeba pracować ze starym interfejsem COM.Wskazówki dotyczące odliczania odwołań COM od
Oto przykład:
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)))
jak widać to wywołanie zwraca 2 wskaźniki (ppHier i ppSC) i obiekt ppMIS. Pytanie brzmi: jak powinienem grać, ładnie z liczeniem odwołań COM.
Rozumiem, że w świecie COM, gdy metoda zwraca wskaźnik do obiektu, ten wskaźnik jest AddRef'ed przed zwróceniem. Co oznacza, że aby zapobiec wyciekowi obiektów COM, muszę je zwolnić, gdy skończę je używać.
Zakładam też, że to, co dostaję jako obiekt, jest już zapakowane w RCW, który zajmie się zwolnieniem referencji po sfinalizowaniu.
Te dwa założenia zastosowane w powyższym wywołaniu oznaczałyby, że muszę się upewnić, że nazwałem "Marshal.Release" na moich 2 wskaźnikach, ale nie powinienem robić nic na temat liczenia referencji w odniesieniu do zwróconego obiektu.
Aby ponownie sformułować moje pytanie: zakładając, że obiekty COM, których używam, są odtwarzane zgodnie z regułami COM, czy podejście jest powyżej właściwego sposobu radzenia sobie z liczeniem odwołań COM?