2010-03-04 9 views
5

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?

risposta

0

In questo scenario particolare si avrebbe bisogno di chiamare Marshal.Release sulle IntPtr variabili altrimenti non andrà via. Naturalmente se vi dico la marshaller utilizzare solo oggetto (o un tipo specifico) direttamente, allora non avrebbe bisogno di preoccuparsi come RCW garantirà l'oggetto viene distrutto ad un certo punto nel futuro (cioè quando il finalizzatore viene chiamato in il processo di raccolta dei rifiuti).

Naturalmente l'approccio finalizzatore potrebbe accadere in un punto non deterministico in tempo, quindi se l'oggetto mantiene una risorsa che è necessario sbarazzarsi di voi dovrebbe idealmente chiamare Marshal.ReleaseComObject per diminuire il conteggio dei riferimenti davanti al involucro fa il rilascio per te.

Problemi correlati