Recentemente ho trascorso un po 'di tempo a scrivere vari progetti di Visual Studio Extensions. Anche se i progetti sono tutti codici gestiti per accedere ai servizi di base VS, è ancora necessario lavorare con le interfacce COM vecchio stile.COM linee guida di conteggio di riferimento di interoperabilità
Ecco un esempio:
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)))
come si può vedere questa chiamata restituisce 2 puntatori (ppHier e PPSC) e un oggetto ppMIS. La domanda è: come dovrei andare a giocare con il conteggio dei riferimenti COM.
E 'la mia comprensione che nel mondo COM quando un metodo restituisce un puntatore ad un oggetto questo puntatore viene AddRef'ed prima di essere restituito. Il che significa che per prevenire la perdita di oggetti COM devo rilasciarli quando ho finito di usarli.
Ho anche supporre che quello che sto ottenendo come un oggetto è già avvolto in un RCW, che avrà cura di riferimento rilascio quando sarà ultimata.
Queste 2 ipotesi applicate alla chiamata precedente significherebbero che devo assicurarmi di chiamare "Marshal.Release" sui miei 2 puntatori, ma non dovrei fare nulla sul conteggio dei riferimenti in relazione all'oggetto restituito.
di riformulare la mia domanda: partendo dal presupposto che gli oggetti COM che sto usando sono di rispetto delle regole COM, è l'approccio di cui sopra il modo giusto per trattare con il conteggio di riferimento COM?