nonComVisibleBaseClass MDA

当从 COM 可见的托管类(派生自非 COM 可见的基类)的 COM 可调用包装 (CCW) 上的本机代码或非托管代码发出 QueryInterface 调用时,将激活 nonComVisibleBaseClass 托管调试助手 (MDA)。 只有在调用请求 COM 可见的托管类的类接口或默认 IDispatch 的情况下,QueryInterface 调用才会导致激活此 MDA。 当 QueryInterface 是针对已应用 ClassInterfaceAttribute 特性并且是由 COM 可见的类显式实现的显式接口时,则不会激活此 MDA。

症状

从本机代码发出的 QueryInterface 调用失败并产生 COR_E_INVALIDOPERATION HRESULT。 该 HRESULT 可能是由于运行时禁止将导致激活此 MDA 的 QueryInterface 调用。

原因

由于潜在的版本管理问题,运行时不允许针对从非 COM 可见的类派生的 COM 可见的类的类接口或默认 IDispatch 接口进行 QueryInterface 调用。 例如,如果向非 COM 可见的基类添加成员,使用派生类的现有 COM 客户端可能会中止,因为派生类的 vtable(它包含基类成员)将由于这样的更改而被改动。 向 COM 公开的显式接口不会遇到此问题,因为它们未在 vtable 中包括接口的基类成员。

解决方法

不要公开类接口。 定义一个显式接口并向其应用 ClassInterfaceAttribute 特性。

对运行时的影响

此 MDA 对 CLR 无任何影响。

Output

下面是 COM 可见的类 Derived(派生自非 COM 可见的类 Base)上的 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

概念

使用托管调试助手诊断错误

互操作封送处理

其他资源

互操作性