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

Int32

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 usato dal codice gestito. È consigliabile usare 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 dell'interfaccia COM entra in Common Language Runtime (CLR), viene eseguito il wrapping in un RCW.

RCW ha un numero di riferimenti incrementato ogni volta che viene mappato un puntatore dell'interfaccia COM. Il ReleaseComObject metodo decrementa il conteggio dei riferimenti di un RCW. Quando il conteggio dei riferimenti raggiunge zero, il runtime rilascia tutti i relativi riferimenti all'oggetto COM non gestito e genera un System.NullReferenceException se si tenta di usare 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 si vuole. Tuttavia, l'uso improprio di può causare un errore dell'applicazione o può causare una violazione di ReleaseComObject accesso.

Si consideri uno scenario in cui il codice gestito in un dominio dell'applicazione viene tenuto in un RCW che rappresenta un componente COM. Se si chiama il metodo in RCW, il ReleaseComObject 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