MDA dirtyCastAndCallOnInterface
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) dirtyCastAndCallOnInterface
é ativado quando há uma tentativa de realizar uma chamada de associação inicial por meio de uma vtable em uma interface de classe que foi marcada como somente associação tardia.
Sintomas
Um aplicativo gera uma violação de acesso ou tem um comportamento inesperado quando você faz uma chamada de associação inicial por meio do COM ao CLR.
Causa
O código está tentando fazer uma chamada de associação inicial por meio de uma vtable em uma interface de classe que é somente associação tardia. Observe que, por padrão, as interfaces de classe são identificadas como sendo somente de associação tardia. Elas também podem ser identificadas como sendo de associação tardia com o atributo ClassInterfaceAttribute com um valor AutoDispatch ([ClassInterface(ClassInterfaceType.AutoDispatch)]
).
Resolução
A resolução recomendada é definir uma interface explícita para uso pelo COM e fazer com que os clientes COM façam a chamada por meio dessa interface, em vez de por meio da interface de classe gerada automaticamente. Como alternativa, a chamada do COM pode ser transformada em uma chamada de associação tardia por meio de IDispatch
.
Por fim, é possível identificar a classe como AutoDual ([ClassInterface(ClassInterfaceType.AutoDual)]
) para permitir que as chamadas de associação inicial sejam feitas por meio do COM; no entanto, o uso de AutoDual não é recomendado devido às limitações de controle de versão descritas no ClassInterfaceAttribute.
Efeito sobre o runtime
Esse MDA não tem efeito sobre o CLR. Ele apenas relata dados sobre chamadas de associação inicial em interfaces de associação tardia.
Saída
O nome do método ou o nome do campo que está sendo acessado com associação inicial.
Configuração
<mdaConfig>
<assistants>
<dirtyCastAndCallOnInterface />
</assistants>
</mdaConfig>