Marshal.ReleaseComObject(Object) Método
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Diminui a contagem de referência do Invólucro Chamável em Tempo de Execução (RCW) associado ao objeto COM especificado.
public:
static int ReleaseComObject(System::Object ^ o);
[System.Security.SecurityCritical]
public static int ReleaseComObject(object o);
public static int ReleaseComObject(object o);
[<System.Security.SecurityCritical>]
static member ReleaseComObject : obj -> int
static member ReleaseComObject : obj -> int
Public Shared Function ReleaseComObject (o As Object) As Integer
Parâmetros
- o
- Object
O COM opõe-se à libertação.
Devoluções
O novo valor da contagem de referência do RCW associado a o. Este valor é tipicamente zero, uma vez que o RCW mantém apenas uma referência ao objeto COM encapsulado, independentemente do número de clientes geridos que o chamam.
- Atributos
Exceções
o não é um objeto COM válido.
o é null.
Observações
Este método é usado para controlar explicitamente a vida útil de um objeto COM usado a partir de código gerido. Deve usar este método para libertar o objeto COM subjacente que contém referências a recursos de forma oportuna ou quando os objetos precisam de ser libertados numa ordem específica.
Sempre que um ponteiro de interface COM entra no tempo de execução da linguagem comum (CLR), é encapsulado num RCW.
O RCW tem uma contagem de referências 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ências chega a zero, o runtime liberta todas as suas referências no objeto COM não gerido e lança um System.NullReferenceException se tentar usar o objeto mais adiante. Se a mesma interface COM for passada mais do que uma vez de código não gerido para código gerido, a contagem de referências no wrapper é incrementada a cada vez, e a chamada ReleaseComObject devolve o número de referências restantes.
Este método permite-lhe forçar a libertação de uma contagem de referências RCW para que ocorra precisamente quando deseja. No entanto, o uso incorreto de ReleaseComObject pode levar à reprovação da sua candidatura ou a violação de acesso.
Considere um cenário em que o código gerido num domínio de aplicação mantém um RCW que representa um componente COM. Se chamar o ReleaseComObject método no RCW, o código gerido não poderá aceder ao RCW e irá abrir uma InvalidComObjectException exceção.
Pode ocorrer um erro mais grave se uma chamada para o RCW estiver a ser executada quando este é libertado. Neste caso, há uma boa hipótese de que o tópico que faz a chamada cause uma violação de acesso. No entanto, a memória do processo pode corromper-se e o processo pode continuar a correr até falhar por razões muito difíceis de depurar.
Este risco é agravado quando o componente COM utilizado é um singleton, pela seguinte razão: o CLR ativa os componentes COM ao chamar a função COM CoCreateInstance , que devolve o mesmo ponteiro de interface sempre que é chamada para componentes COM singleton. Assim, pedaços separados e independentes de código gerido num domínio de aplicação podem estar a usar o mesmo RCW para um componente COM singleton, e se algum chamar o ReleaseComObject método no componente COM, o outro ficará quebrado.
Por isso, use o ReleaseComObject único se for absolutamente necessário. Se quiser chamar este método para garantir que um componente COM é lançado numa data determinada, considere usar o FinalReleaseComObject método em vez disso. FinalReleaseComObject libertará o componente COM subjacente independentemente de quantas vezes tenha reentrado no CLR. A contagem interna de referências do RCW é incrementada em um cada vez que o componente COM reentra no CLR. Assim, poderia chamar o ReleaseComObject método num ciclo até que o valor devolvido seja zero. Isto alcança o mesmo resultado do FinalReleaseComObject método.