nonComVisibleBaseClass MDA

Note

This article is specific to .NET Framework. It doesn't apply to newer implementations of .NET, including .NET 6 and later versions.

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. 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. 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

A QueryInterface call made from native code that is failing with a COR_E_INVALIDOPERATION HRESULT. The HRESULT might be due to the runtime disallowing QueryInterface calls that would cause the activation of this MDA.

Cause

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. 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. 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. Define an explicit interface and apply the ClassInterfaceAttribute attribute to it.

Effect on the Runtime

This MDA has no effect on the CLR.

Output

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