Partilhar via


gcManagedToUnmanaged MDA

Nota

Este artigo é específico do .NET Framework. Ele não se aplica a implementações mais recentes do .NET, incluindo o .NET 6 e versões posteriores.

O gcManagedToUnmanaged assistente de depuração gerenciado (MDA) causa uma coleta de lixo sempre que um thread transita de código gerenciado para não gerenciado.

Sintomas

Um componente de usuário não gerenciado gera uma violação de acesso ao tentar usar um objeto gerenciado que foi exposto ao COM. O objeto COM parece ter sido liberado. A violação de acesso não é determinística.

Motivo

Se um componente não gerenciado não for referência contando um objeto COM gerenciado corretamente, o tempo de execução poderá coletar um objeto gerenciado exposto a COM quando o componente não gerenciado ainda mantiver uma referência ao objeto. O tempo de execução chama Release durante as coletas de lixo, portanto, se o componente do usuário usar o objeto antes da coleta de lixo ocorrer, ele ainda não terá sido coletado. Esta é a fonte do não-determinismo.

Resolução

Habilitar esse assistente reduz o tempo entre quando o objeto é qualificado para coleta e Release é chamado, ajudando a rastrear qual componente não gerenciado tenta acessar o objeto coletado pela primeira vez.

Efeito no tempo de execução

Causa uma coleta de lixo sempre que um thread faz a transição de código gerenciado para não gerenciado.

Saída

Este MDA não produz nenhuma saída.

Configuração

<mdaConfig>
  <assistants>
    <gcManagedToUnmanaged/>
  </assistants>
</mdaConfig>

Consulte também