nonComVisibleBaseClass MDAnonComVisibleBaseClass MDA

nonComVisibleBaseClass マネージド デバッグ アシスタント (MDA: Managed Debugging Assistant) は、COM 参照可能ではない基本クラスから派生した COM 参照可能マネージド クラスの COM 呼び出し可能ラッパー (CCW: COM Callable Wrapper) で、ネイティブ コードまたはアンマネージド コードによって QueryInterface 呼び出しがなされるとアクティブになります。The nonComVisibleBaseClass managed debugging assistant (MDA) is activated when a QueryInterface call is made by native or unmanaged code on the COM callable wrapper (CCW) of a COM-visible managed class that derives from a base class that is not COM visible. QueryInterface 呼び出しによって MDA がアクティブになるのは、COM 参照可能マネージド クラスのクラス インターフェイスまたは既定の IDispatch が呼び出しによって要求された場合のみです。The QueryInterface call causes the MDA to activate only in cases where call requests the class interface or default IDispatch of the COM-visible managed class. QueryInterface 呼び出しが、ClassInterfaceAttribute 属性が適用され、COM 参照可能クラスによって明示的に実装された明示的なインターフェイスに対する呼び出しである場合、この MDA はアクティブになりません。The MDA is not activated when the QueryInterface is for an explicit interface that has the ClassInterfaceAttribute attribute applied and is explicitly implemented by the COM-visible class.

現象Symptoms

ネイティブ コードからなされた QueryInterface 呼び出しが COR_E_INVALIDOPERATION HRESULT により失敗します。A QueryInterface call made from native code that is failing with a COR_E_INVALIDOPERATION HRESULT. HRESULT は、この MDA をアクティブにする QueryInterface 呼び出しをランタイムが許可しないことによって発生することがあります。The HRESULT might be due to the runtime disallowing QueryInterface calls that would cause the activation of this MDA.

原因Cause

ランタイムは、COM 参照可能ではないクラスから派生した COM 参照可能クラスのクラス インターフェイスまたは既定の QueryInterface インターフェイスに対する IDispatch 呼び出しを許可できません。これは、バージョン管理に関係する問題が発生する可能性があるからです。The runtime cannot allow QueryInterface calls for the class interface or default IDispatch interface of a COM-visible class that derives from a class that is not COM-visible because of potential versioning problems. たとえば、COM 参照可能でない基本クラスにパブリック メンバーを追加した場合、基本クラス メンバーを含む派生クラスの vtable がこの変更によって変更されるため、派生クラスを使用する既存の COM クライアントが破損する可能性があります。For example, if any public members were added to the base class that is not COM-visible, existing COM clients using the derived class could potentially break because the vtable of the derived class, which contains the base class members, would be altered by such a change. COM に公開されている明示的なインターフェイスの場合は、インターフェイスの基本メンバーが vtable に含まれないため、この問題は発生しません。Explicit interfaces exposed to COM do not have this problem because they do not include the base members of interfaces in the vtable.

解決策Resolution

クラス インターフェイスを公開しないでください。Do not expose the class interface. 明示的なインターフェイスを定義し、それに ClassInterfaceAttribute 属性を適用します。Define an explicit interface and apply the ClassInterfaceAttribute attribute to it.

ランタイムへの影響Effect on the Runtime

この MDA は CLR に影響しません。This MDA has no effect on the CLR.

出力Output

非 COM 参照可能クラス QueryInterface から派生した COM 参照可能クラス DerivedBase 呼び出しを実行した場合のメッセージ例を次に示します。The following is an example message for a QueryInterface call on a COM-visible class Derived that derives from a non-COM-visible class Base.

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.   

構成Configuration

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

参照See also