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
o
Type: System.ObjectO objeto COM a ser liberado.
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
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