nonComVisibleBaseClass MDA

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

現象

ネイティブ コードからなされた QueryInterface 呼び出しが COR_E_INVALIDOPERATION HRESULT により失敗します。 HRESULT は、この MDA をアクティブにする QueryInterface 呼び出しをランタイムが許可しないことによって発生することがあります。

原因

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

解決方法

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

ランタイムへの影響

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

出力

非 COM 参照可能クラス Base から派生した COM 参照可能クラス DerivedQueryInterface 呼び出しを実行した場合のメッセージ例を次に示します。

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>  

関連項目