nonComVisibleBaseClass MDA

更新 : 2007 年 11 月

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 参照可能クラス 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>

参照

概念

マネージ デバッグ アシスタントによるエラーの診断

相互運用マーシャリングの概要

参照

MarshalAsAttribute

その他の技術情報

相互運用性