dirtyCastAndCallOnInterface 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 dirtyCastAndCallOnInterface
assistente de depuração gerenciado (MDA) é ativado quando uma chamada de ligação antecipada por meio de um vtable é tentada em uma interface de classe que foi marcada apenas como vinculação tardia.
Sintomas
Um aplicativo gera uma violação de acesso ou tem um comportamento inesperado ao fazer uma chamada antecipada via COM no CLR.
Motivo
Code está tentando uma chamada de ligação antecipada através de um vtable por meio de uma interface de classe que é apenas de ligação tardia. Observe que, por padrão, as interfaces de classe são identificadas como sendo apenas de ligação tardia. Eles também podem ser identificados como ligados tardiamente com o ClassInterfaceAttribute atributo com um AutoDispatch valor ([ClassInterface(ClassInterfaceType.AutoDispatch)]
).
Resolução
A resolução recomendada é definir uma interface explícita para uso por COM e fazer com que os clientes COM chamem através dessa interface em vez de através da interface de classe gerada automaticamente. Alternativamente, a chamada da COM pode ser transformada em uma chamada tardia via IDispatch
.
Finalmente, é possível identificar a classe como AutoDual ([ClassInterface(ClassInterfaceType.AutoDual)]
) para permitir que chamadas vinculadas antecipadas sejam feitas a partir de COM, no entanto, o uso AutoDual é fortemente desencorajado devido às limitações de controle de versão descritas em ClassInterfaceAttribute.
Efeito no tempo de execução
Este MDA não tem efeito sobre o CLR. Ele só relata dados sobre chamadas de ligação antecipada em interfaces de ligação tardia.
Saída
O nome do método ou nome do campo que está sendo acessado com limite antecipado.
Configuração
<mdaConfig>
<assistants>
<dirtyCastAndCallOnInterface />
</assistants>
</mdaConfig>