nonComVisibleBaseClass MDA

Note

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

nonComVisibleBaseClass マネージド デバッグ アシスタント (MDA) は、COM に表示されない基底クラスから派生した COM 参照可能マネージド クラスの COM 呼び出し可能ラッパー (CCW) でネイティブコードまたはアンマネージ コードによってQueryInterface呼び出しが行われるときにアクティブ化されます。 QueryInterface呼び出しでは、呼び出しが COM から参照可能なマネージド クラスのクラス インターフェイスまたは既定のIDispatchを要求した場合にのみ、MDA がアクティブになります。 MDA は、 QueryInterface が、 ClassInterfaceAttribute 属性が適用され、COM から参照可能なクラスによって明示的に実装されている明示的なインターフェイスに対してはアクティブ化されません。

Symptoms

COR_E_INVALIDOPERATION HRESULT で失敗しているネイティブ コードから行われた QueryInterface 呼び出し。 HRESULT は、ランタイムが、この MDA のアクティブ化を引き起こす QueryInterface 呼び出しを禁止したことが原因である可能性があります。

原因

ランタイムは、バージョン管理の問題が発生する可能性があるため、COM に表示されないクラスから派生した COM 可視クラスのクラス インターフェイスまたは既定のIDispatch インターフェイスのQueryInterface呼び出しを許可できません。 たとえば、COM 参照できないパブリック メンバーが基底クラスに追加された場合、派生クラスを使用する既存の COM クライアントは、基底クラスのメンバーを含む派生クラスの vtable がこのような変更によって変更されるため、中断する可能性があります。 COM に公開されている明示的なインターフェイスには、vtable 内のインターフェイスの基本メンバーが含まれていないため、この問題はありません。

Resolution

クラス インターフェイスを公開しないでください。 明示的なインターフェイスを定義し、 ClassInterfaceAttribute 属性を適用します。

ランタイムへの影響

この MDA は CLR には影響しません。

アウトプット

COM から参照できないクラス Baseから派生する COM 参照可能なクラス Derivedに対するQueryInterface呼び出しのメッセージ例を次に示します。

A QueryInterface call was made requesting the class interface of COM
visible managed class 'Derived'. However since this class derives from
non COM visible class 'Base', the QueryInterface call will fail. This
is done to prevent the non COM visible base class from being
constrained by the COM versioning rules.

コンフィギュレーション

<mdaConfig>
  <assistants>
    <nonComVisibleBaseClass />
  </assistants>
</mdaConfig>

こちらも参照ください