Quando o tempo de execução .NET mantém uma contagem de referência> 1 para objetos COM?

StackOverflow https://stackoverflow.com/questions/2567236

  •  24-09-2019
  •  | 
  •  

Pergunta

Até recentemente, eu acreditava que o tempo de execução .NET aumenta apenas a contagem de referência dos objetos COM por 1 ao criar um invólucro de tempo de execução, e que apenas um desses invólucros de tempo de execução é criado para qualquer objeto COM.

Se não me engano, o acima implica que Marshal.FinalReleasecomObject e Marshal.releasecomObject Faça a mesma coisa na prática.

No entanto, hoje eu estava escrevendo alguns testes para verificar se os objetos COM são lançados corretamente pelo meu código. Eu faço isso invocando o objeto supostamente lançado e verificando o esperado InvalidComObjectException. Acontece que há casos em que a exceção é lançada após um FinalReleaseComObject, mas não depois de um ReleaseComObject.

Isso significa que o tempo de execução .NET 2.0 pode manter mais de uma referência a um objeto COM? Se sim, quando isso faz isso?

Foi útil?

Solução

Há um nível extra de indireção aqui. Sim, o RCW mantém uma única contagem de referência nos ponteiros nativos da interface com. Mas o RCW também possui uma contagem de referência, é incrementado toda vez que um ponteiro de interface COM é mapeado para o RCW. O que pode acontecer se um método COM retornar um ponteiro de interface. O finalizador da classe de invólucro .NET correspondente a diminui.

Você pode mexer com essa contagem de referência diretamente através do marshal.releasecomObject (), que o diminui por um como o Finalizador, e Marshal.FinalReleasecomObject (), que o zero, garantindo que o método Iunknown :: Release () seja chamado . Obviamente, eles se enquadram na categoria "melhor sabem o que você está fazendo". Conseguir errado produz o objeto feio e indefinido "com a exceção do RCW subjacente".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top