nonComVisibleBaseClass MDA

注释

本文特定于 .NET Framework。 它不适用于 .NET 的较新版本实现,包括 .NET 6 及更高版本。

nonComVisibleBaseClass COM 可见托管类的 COM 可调用包装器(CCW)上的本机或非托管代码对从不可见 COM 可见的基类派生的 COM 可调用包装器(CCW)进行调用时 QueryInterface ,将激活托管调试助手(MDA)。 调用 QueryInterface 仅当调用请求类接口或 COM 可见托管类的默认值 IDispatch 时,MDA 才会激活。 当 MDA 用于应用属性的显式接口ClassInterfaceAttribute并由 COM 可见类显式实现时QueryInterface,不会激活 MDA。

症状

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

原因

运行时不能允许 QueryInterface 调用 COM 可见类的类接口或默认 IDispatch 接口,该类派生自因潜在的版本控制问题而不可见的类。 例如,如果将任何公共成员添加到不可见 COM 的基类中,则使用派生类的现有 COM 客户端可能会中断,因为包含基类成员的派生类(包含基类成员)的 vtable 将受到此类更改的更改。 向 COM 公开的显式接口没有此问题,因为它们不包括 vtable 中接口的基成员。

解决方案

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

对运行时的影响

此 MDA 对 CLR 没有影响。

输出

下面是对从非 COM 可见类派生的 COM 可见类DerivedBase的调用的示例消息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>

另见