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.

Valori restituiti

Nuovo valore del conteggio dei riferimenti dell'RCW associato a o. Questo valore è in genere zero perché rcw mantiene un solo riferimento all'oggetto COM di cui è stato eseguito il wrapping indipendentemente dal numero di 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 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 di interfaccia COM entra in Common Language Runtime (CLR), viene eseguito il 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 zero, il runtime rilascia tutti i 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 improprio di può causare un errore dell'applicazione ReleaseComObject o può causare una violazione dell'accesso.

Si consideri uno scenario in cui il codice gestito in un dominio applicazione è in possesso di 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 .

Un errore più grave può verificarsi se una chiamata all'RCW viene eseguita quando viene rilasciata la rcw. In questo caso, esiste una buona probabilità 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 riesce per motivi molto difficili da eseguire per il debug.

Questo rischio è 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 l'oggetto ReleaseComObject solo se è assolutamente necessario. Se si desidera 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 immesso nuovamente 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