Condividi tramite


Marshal.ReleaseComObject(Object) Metodo

Definizione

Decrementa il conteggio dei riferimenti del Runtime Callable Wrapper (RCW) associato all'oggetto COM specificato.

public:
 static int ReleaseComObject(System::Object ^ o);
[System.Security.SecurityCritical]
public static int ReleaseComObject (object o);
[System.Runtime.Versioning.SupportedOSPlatform("windows")]
public static int ReleaseComObject (object o);
public static int ReleaseComObject (object o);
[<System.Security.SecurityCritical>]
static member ReleaseComObject : obj -> int
[<System.Runtime.Versioning.SupportedOSPlatform("windows")>]
static member ReleaseComObject : obj -> int
static member ReleaseComObject : obj -> int
Public Shared Function ReleaseComObject (o As Object) As Integer

Parametri

o
Object

Oggetto COM da rilasciare.

Restituisce

Nuovo valore del conteggio dei riferimenti dell'RCW associato a o. Questo valore in genere è zero poiché RCW conserva solo un riferimento all'oggetto COM incluso indipendentemente dal numero dei client gestiti che lo chiamano.

Attributi

Eccezioni

o non è un oggetto COM valido.

Commenti

Questo metodo viene usato per controllare in modo esplicito la durata di un oggetto COM utilizzato dal codice gestito. È consigliabile utilizzare questo metodo per liberare l'oggetto COM sottostante che contiene riferimenti alle risorse in modo tempestivo o quando gli oggetti devono essere liberati in un ordine specifico.

Ogni volta che un puntatore all'interfaccia COM entra in Common Language Runtime (CLR), viene sottoposto a wrapping in un RCW.

L'RCW ha un conteggio dei riferimenti incrementato ogni volta che viene eseguito il mapping di un puntatore all'interfaccia COM. Il ReleaseComObject metodo decrementa il conteggio dei riferimenti di un RCW. Quando il conteggio dei riferimenti raggiunge lo zero, il runtime rilascia tutti i relativi riferimenti sull'oggetto COM non gestito e genera un'eccezione System.NullReferenceException se si tenta di utilizzare ulteriormente l'oggetto . Se la stessa interfaccia COM viene passata più di una volta dal codice non gestito al codice gestito, il conteggio dei riferimenti sul wrapper viene incrementato ogni volta e la chiamata ReleaseComObject restituisce il numero di riferimenti rimanenti.

Questo metodo consente di forzare una versione del conteggio dei riferimenti RCW in modo che si verifichi esattamente quando lo si desidera. Tuttavia, l'uso non corretto di può causare un errore dell'applicazione ReleaseComObject o può causare una violazione di accesso.

Si consideri uno scenario in cui il codice gestito in un dominio dell'applicazione sta tenendo premuto un RCW che rappresenta un componente COM. Se si chiama il ReleaseComObject metodo nella versione RCW, il codice gestito non sarà in grado di accedere a RCW e genererà un'eccezione InvalidComObjectException .

Può verificarsi un errore più grave se viene eseguita una chiamata alla RCW quando viene rilasciato rcw. In questo caso, è possibile che il thread che effettua la chiamata provocherà una violazione di accesso. Tuttavia, la memoria del processo può diventare danneggiata e il processo può continuare a essere eseguito fino a quando non ha esito negativo per motivi molto difficili da eseguire nel debug.

Questo rischio viene composto quando il componente COM utilizzato è un singleton, per il motivo seguente: CLR attiva i componenti COM chiamando la funzione COM CoCreateInstance , che restituisce lo stesso puntatore di interfaccia ogni volta che viene chiamato per i componenti COM singleton. Di conseguenza, parti separate e indipendenti di codice gestito in un dominio applicazione possono usare lo stesso RCW per un componente COM singleton e, se una chiama il ReleaseComObject metodo nel componente COM, l'altra verrà interrotta.

Pertanto, usare solo ReleaseComObject se è assolutamente obbligatorio. Se si vuole chiamare questo metodo per assicurarsi che un componente COM venga rilasciato in un determinato momento, prendere in considerazione l'uso del FinalReleaseComObject metodo . FinalReleaseComObject rilascia il componente COM sottostante indipendentemente dal numero di volte in cui è stato nuovamente immesso CLR. Il conteggio dei riferimenti interni dell'RCW viene incrementato di uno ogni volta che il componente COM entra nuovamente in CLR. Pertanto, è possibile chiamare il ReleaseComObject metodo in un ciclo fino a quando il valore restituito non è zero. In questo modo si ottiene lo stesso risultato del FinalReleaseComObject metodo .

Si applica a

Vedi anche