2010-03-04 14 views
5

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?

Odpowiedz

0

W tym konkretnym scenariuszu trzeba by zadzwonić Marshal.Release na IntPtr zmiennych inaczej nie odejdzie. Oczywiście, jeśli powiesz marszałkowi, aby użył obiektu (lub określonego typu) bezpośrednio, nie musiałbyś się tym martwić, ponieważ RCW zapewni, że obiekt zostanie zniszczony w pewnym momencie w przyszłości (tj. Gdy wywoływacz zostanie wywołany proces usuwania śmieci).

Oczywiście podejście finalizator może się zdarzyć w niedeterministycznym momencie więc jeśli obiekt utrzymuje jakiś zasób, który trzeba pozbyć się ciebie powinny najlepiej zadzwonić Marshal.ReleaseComObject aby zmniejszyć jej licznika odwołań przed owijki uwalnia cię za ciebie.

Powiązane problemy