Freigeben über


dirtyCastAndCallOnInterface-MDA

Hinweis

Dieser Artikel gilt für das .NET Framework. Sie gilt nicht für neuere Implementierungen von .NET, einschließlich .NET 6 und höherer Versionen.

Der dirtyCastAndCallOnInterface-MDA (Managed Debugging Assistant, Assistent für verwaltetes Debuggen) wird aktiviert, wenn für eine Klassenschnittstelle, die für ausschließlich späte Bindung gekennzeichnet ist, ein früh gebundener Aufruf über eine Vtable erfolgt.

Symptome

Eine Anwendung löst eine Zugriffsverletzung aus oder zeigt unerwartetes Verhalten, wenn ein früh gebundener Aufruf über COM in die CLR erfolgt

Ursache

Code versucht einen früh gebundenen Aufruf durch eine Vtable über eine Klassenschnittstelle, die nur spät gebunden wird. Beachten Sie, dass Klassenschnittstellen standardmäßig als ausschließlich spät gebunden gekennzeichnet werden. Sie können aber auch mit dem ClassInterfaceAttribute-Attribut mit einem AutoDispatch-Wert ([ClassInterface(ClassInterfaceType.AutoDispatch)]) als spät gebunden gekennzeichnet werden.

Lösung

Die empfohlene Lösung besteht darin, eine explizite Schnittstelle für die Verwendung durch COM zu definieren und Aufrufe von COM-Clients über diese Schnittstelle erfolgen zu lassen, nicht über die automatisch generierte Klassenschnittstelle. Alternativ kann der Aufruf aus COM über IDispatch in einen spät gebundenen Aufruf transformiert werden.

Schließlich kann die Klasse auch als AutoDual ([ClassInterface(ClassInterfaceType.AutoDual)]) gekennzeichnet werden, um früh gebundene Aufrufe aus COM zuzulassen. Wegen der unter ClassInterfaceAttribute beschriebenen Versionseinschränkungen wird jedoch dringend davon abgeraten, AutoDual zu verwenden.

Auswirkungen auf die Laufzeit

Dieser MDA hat keine Auswirkungen auf die CLR. Er meldet nur Daten über früh gebundene Aufrufe für spät gebundene Schnittstellen.

Output

Der Name der Methode oder des Felds, auf die oder das über frühe Bindung zugegriffen wird.

Konfiguration

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

Siehe auch