Partilhar via


Marshal.ReleaseComObject(Object) Método

Definição

Diminui a contagem de referência do RCW (Runtime Callable Wrapper) associado ao objeto COM especificado.

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

Parâmetros

o
Object

O objeto COM a ser liberado.

Retornos

O novo valor da contagem de referência do RCW associado ao o. Normalmente, esse valor é zero, pois o RCW mantém apenas uma referência ao objeto COM encapsulado, independentemente do número de clientes gerenciados que estejam chamando-o.

Atributos

Exceções

O o não é um objeto COM válido.

Comentários

Esse método é usado para controlar explicitamente o tempo de vida de um objeto COM usado do código gerenciado. Você deve usar esse método para liberar o objeto COM subjacente que contém referências aos recursos em tempo hábil ou quando os objetos devem ser liberados em uma ordem específica.

Sempre que um ponteiro de interface COM entra no CLR (Common Language Runtime), ele é encapsulado em um RCW.

O RCW tem uma contagem de referência que é incrementada sempre que um ponteiro de interface COM é mapeado para ele. O ReleaseComObject método diminui a contagem de referência de um RCW. Quando a contagem de referência atinge zero, o runtime libera todas as suas referências no objeto COM não gerenciado e lança um System.NullReferenceException se você tentar usar o objeto ainda mais. Se a mesma interface COM for passada mais de uma vez de não gerenciada para código gerenciado, a contagem de referência no wrapper será incrementada todas as vezes e a chamada ReleaseComObject retornará o número de referências restantes.

Esse método permite forçar uma versão de contagem de referência RCW para que ela ocorra precisamente quando você quiser. No entanto, o uso inadequado de ReleaseComObject pode causar falha no aplicativo ou causar uma violação de acesso.

Considere um cenário no qual o código gerenciado em um domínio de aplicativo está mantendo um RCW que representa um componente COM. Se você chamar o ReleaseComObject método no RCW, o código gerenciado não poderá acessar o RCW e gerará uma exceção InvalidComObjectException .

Um erro mais grave poderá ocorrer se uma chamada para o RCW estiver sendo executada quando o RCW for liberado. Nesse caso, há uma boa chance de que o thread que está fazendo a chamada cause uma violação de acesso. No entanto, a memória do processo pode ficar corrompida e o processo pode continuar a ser executado até que falhe por motivos muito difíceis de depurar.

Esse risco é agravado quando o componente COM que está sendo usado é um singleton, pelo seguinte motivo: o CLR ativa componentes COM chamando a função COM CoCreateInstance , que retorna o mesmo ponteiro de interface sempre que é chamado para componentes COM singleton. Assim, partes separadas e independentes do código gerenciado em um domínio de aplicativo podem estar usando o mesmo RCW para um componente COM singleton e, se um chamar o ReleaseComObject método no componente COM, o outro será quebrado.

Portanto, use o ReleaseComObject somente se for absolutamente necessário. Se você quiser chamar esse método para garantir que um componente COM seja liberado em um momento determinado, considere usar o FinalReleaseComObject método em vez disso. FinalReleaseComObject lançará o componente COM subjacente, independentemente de quantas vezes ele inseriu novamente o CLR. A contagem de referência interna do RCW é incrementada por um sempre que o componente COM entra novamente no CLR. Portanto, você pode chamar o ReleaseComObject método em um loop até que o valor retornado seja zero. Isso obtém o mesmo resultado que o FinalReleaseComObject método .

Aplica-se a

Confira também