Condividi tramite


MDA dirtyCastAndCallOnInterface

Nota

Questo articolo è specifico per .NET Framework. Non si applica alle implementazioni più recenti di .NET, incluse .NET 6 e versioni successive.

L'assistente al debug gestito dirtyCastAndCallOnInterface viene attivato quando viene tentata una chiamata ad associazione anticipata attraverso un vtable su un'interfaccia di classe contrassegnata solo per l'associazione tardiva.

Sintomi

Un'applicazione genera una violazione di accesso o ha un comportamento imprevisto quando si inserisce in CLR una chiamata ad associazione anticipata tramite COM.

Causa

Il codice sta tentando una chiamata ad associazione anticipata attraverso un vtable tramite un'interfaccia di classe solo ad associazione tardiva. Si noti che, per impostazione predefinita, le interfacce di classe vengono identificate solo come ad associazione tardiva. Possono essere identificate come ad associazione tardiva anche con l'attributo ClassInterfaceAttribute con un valore AutoDispatch ([ClassInterface(ClassInterfaceType.AutoDispatch)]).

Risoluzione

La soluzione consigliata prevede di definire un'interfaccia esplicita da usare con COM e di fare in modo che i client COM chiamino tramite questa interfaccia invece che tramite l'interfaccia di classe generata automaticamente. In alternativa, è possibile trasformare la chiamata da COM in una chiamata ad associazione tardiva mediante IDispatch.

Infine, è possibile identificare la classe come AutoDual ([ClassInterface(ClassInterfaceType.AutoDual)]) per consentire alle chiamate ad associazione anticipata di essere inserite da COM. Tuttavia, l'uso di AutoDual è fortemente sconsigliato a causa delle limitazioni nel controllo delle versioni descritte in ClassInterfaceAttribute.

Effetto sull'ambiente di esecuzione

L'assistente al debug gestito non ha alcun effetto su CLR. Segnala solo i dati sulle chiamate ad associazione anticipata sulle interfacce ad associazione tardiva.

Output

Nome del metodo o nome del campo a cui si accede con associazione anticipata.

Impostazione

<mdaConfig>
  <assistants>
    <dirtyCastAndCallOnInterface />
  </assistants>
</mdaConfig>

Vedi anche