Domanda

Fino a poco tempo, ho creduto che il runtime .NET aumenta solo il conteggio dei riferimenti di COM oggetti da 1 quando si crea un runtime-callable involucro , e che solo un involucro ad runtime-callable per ogni oggetto COM.

Se non mi sbaglio, quanto sopra implica che Marshal.FinalReleaseComObject e Marshal.ReleaseComObject fare la stessa cosa, in pratica.

Tuttavia, oggi stavo scrivendo alcuni test per verificare che gli oggetti COM siano correttamente rilasciati da mio codice. Lo faccio invocando l'oggetto presumibilmente rilasciato e controllo per il InvalidComObjectException previsto. Si scopre che ci sono casi in cui l'eccezione viene generata dopo un FinalReleaseComObject, ma non dopo un ReleaseComObject.

Questo significa che il runtime .NET 2.0 può contenere più di un riferimento a un oggetto COM? Se sì, quando fa fare questo?

È stato utile?

Soluzione

C'è un ulteriore livello di indirezione qui. Sì, il RCW mantiene un unico conteggio dei riferimenti sui puntatori di interfaccia COM nativi. Ma il RCW ha un conteggio di riferimento troppo, che viene incrementato ogni volta che un puntatore di interfaccia COM viene mappato il RCW. Il che può accadere se un metodo COM restituisce un puntatore. Finalizzatore del corrispondente involucro NET classe decrementa.

È possibile sperimentare con quel riferimento contare direttamente attraverso Marshal.ReleaseComObject (), che decrementa di uno come il finalizzatore fa, e Marshal.FinalReleaseComObject (), che zaps a zero, garantendo che l'IUnknown :: Release () metodo viene chiamato. Essi ovviamente caduta nella categoria "meglio sapere cosa si sta facendo". Ottenere produce sbagliato il brutto e undebuggable "oggetto COM separato dal suo RCW sottostante" eccezione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top