Compartilhar via


Método Marshal.ReleaseComObject (Object)

 

Observação

The .NET API Reference documentation has a new home. Visit the .NET API Browser on docs.microsoft.com to see the new experience.

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

Namespace:   System.Runtime.InteropServices
Assembly:  mscorlib (em mscorlib.dll)

Sintaxe

[SecurityCriticalAttribute]
public static int ReleaseComObject(
    object o
)
public:
[SecurityCriticalAttribute]
static int ReleaseComObject(
    Object^ o
)
[<SecurityCriticalAttribute>]
static member ReleaseComObject : 
        o:Object -> int
<SecurityCriticalAttribute>
Public Shared Function ReleaseComObject (
    o As Object
) As Integer

Parâmetros

Valor Retornado

Type: System.Int32

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.

Exceções

Exception Condition
ArgumentException

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

NullReferenceException

o é null.

Comentários

Esse método é usado para controlar explicitamente o tempo de vida de um objeto COM usado no código gerenciado. Você deve usar esse método para liberar o objeto COM subjacente que contém referências a recursos de maneira oportuna ou objetos devem ser liberados em uma ordem específica.

Sempre que um ponteiro de interface COM insere o common language runtime (CLR), ele é encapsulado em um RCW.

RCW tem uma contagem de referência que é incrementada toda vez que um ponteiro de interface COM é mapeado para ele. O ReleaseComObject diminui de método a contagem de referência de um RCW. Quando a contagem de referência chega a zero, o tempo de execução 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 é passada mais de uma vez de não gerenciado para código gerenciado, a contagem de referência em um wrapper é incrementado toda vez e chamada ReleaseComObject retorna o número de referências restantes.

Esse método permite que você force uma versão de contagem de referência RCW para que ele ocorre precisamente quando você quiser. No entanto, o uso inadequado de ReleaseComObject pode fazer com que o aplicativo falhar, ou pode causar uma violação de acesso.

Considere um cenário no qual o código gerenciado em um domínio de aplicativo mantiver 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á um InvalidComObjectException exceção.

Um erro mais grave pode ocorrer se uma chamada para o RCW está em execução quando o RCW é liberado. Nesse caso, há uma boa chance de que o thread que faz a chamada fará com que uma violação de acesso. No entanto, memória de processo pode ser corrompida e o processo pode continuar a executar até falhar por razões que são muito difíceis de depurar.

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

Portanto, usar o ReleaseComObject somente se ele é absolutamente necessário. Se você deseja chamar esse método para garantir que um componente COM é liberado em um momento determinado, considere o uso de FinalReleaseComObject método em vez disso.FinalReleaseComObjectliberará o componente COM subjacente, independentemente de quantas vezes ela entrou novamente o CLR. A contagem de referência interna do RCW é incrementada em um cada vez que o componente COM reinserido CLR. Portanto, você poderia chamar o ReleaseComObject método em um loop até que o valor retornado é zero. Gera o mesmo resultado que o FinalReleaseComObject método.

Segurança

SecurityCriticalAttribute

requires full trust for the immediate caller. This member cannot be used by partially trusted or transparent code.

Informações de Versão

Plataforma Universal do Windows
Disponível desde 8
.NET Framework
Disponível desde 1.1
Biblioteca de Classes Portátil
Com suporte no: plataformas portáteis do .NET
Windows Phone Silverlight
Disponível desde 8.0
Windows Phone
Disponível desde 8.1

Confira Também

FinalReleaseComObject
NullReferenceException
Classe Marshal
Namespace System.Runtime.InteropServices

Retornar ao início