次の方法で共有


dirtyCastAndCallOnInterface MDA

Note

この記事は .NET Framework に固有のものです。 .NET 6 以降のバージョンを含む、.NET の新しい実装には適用されません。

dirtyCastAndCallOnInterface マネージド デバッグ アシスタント (MDA: Managed Debugging Assistant) は、vtable を使用して事前バインディングされた呼び出しが、遅延バインディング専用とマークされたクラス インターフェイスで試行されたときにアクティブ化されます。

現象

COM 経由で CLR への事前バインディングされた呼び出しが実行されると、アプリケーションはアクセス違反をスローするか、予期しない動作に発生します。

原因

コードは、遅延バインディング専用のクラス インターフェイス経由で、vtable を使用して事前バインディングされた呼び出しを試行しています。 既定では、クラス インターフェイスは遅延バインディング専用として識別されることに注意してください。 また、ClassInterfaceAttribute 属性に AutoDispatch 値 ([ClassInterface(ClassInterfaceType.AutoDispatch)]) が設定されている場合も、遅延バインディングとして識別されます。

解決方法

推奨される解決策としては、COM で使用するための明示的なインターフェイスを定義し、自動生成されるクラス インターフェイスを通してではなく、このインターフェイスを通して、COM クライアント呼び出しを実行するようにする方法があります。 代わりに、IDispatch を介して、COM からの呼び出しを遅延バインディングされた呼び出しに変換することもできます。

事前バインディングされた呼び出しを COM から実行できるように、クラスを AutoDual ([ClassInterface(ClassInterfaceType.AutoDual)]) として識別することもできます。ただし、「ClassInterfaceAttribute」に記載されているバージョン管理の制約から、AutoDual を使用しないことを強く推奨します。

ランタイムへの影響

この MDA は CLR に影響しません。 遅延バインディングされたインターフェイス上の事前バインディングされた呼び出しに関するデータを報告するだけです。

出力

事前バインディングでアクセスされたメソッド名またはフィールド名です。

構成

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

関連項目