MDA gcManagedToUnmanaged
Observação
Este artigo é específico para aplicativos .NET Framework. Ele não se aplica a implementações mais recentes do .NET, incluindo o .NET 6 e versões posteriores.
O MDA (assistente para depuração gerenciada) gcManagedToUnmanaged
causa uma coleta de lixo sempre que um thread faz a transição de código gerenciado para código 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 tinha sido exposto a COM. O objeto COM parece ter sido liberado. A violação de acesso é não determinística.
Causa
Se um componente não gerenciado não estiver fazendo uma contagem de referência de um objeto COM gerenciado corretamente, o runtime poderá coletar um objeto gerenciado exposto ao COM quando o componente não gerenciado ainda contiver uma referência ao objeto. O runtime chama Release durante as coletas de lixo e, portanto, se o componente de usuário usar o objeto antes que a coleta de lixo ocorra, ele ainda não terá sido coletado. Essa é a origem do não determinismo.
Resolução
A habilitação deste assistente reduz o tempo entre o período em que o objeto é qualificado para a coleta e Release é chamado, ajudando a rastrear qual componente não gerenciado tenta acessar o objeto coletado primeiro.
Efeito sobre o runtime
Causa uma coleta de lixo sempre que um thread faz a transição de código gerenciado para código não gerenciado.
Saída
Esse MDA não produz nenhuma saída.
Configuração
<mdaConfig>
<assistants>
<gcManagedToUnmanaged/>
</assistants>
</mdaConfig>