Compartir a través de


MDA de nonComVisibleBaseClass

Nota:

Este artículo es específico de .NET Framework. No se aplica a implementaciones más recientes de .NET, incluidas .NET 6 y versiones posteriores.

El Asistente para la depuración administrada (MDA) nonComVisibleBaseClass se activa cuando se realiza una llamada a QueryInterface desde código no administrado o nativo en el contenedor CCW de una clase administrada visible para COM que deriva de una clase base que no es visible para COM. La llamada a QueryInterface hace que el MDA se active solo cuando la llamada solicita la interfaz de clase o la interfaz predeterminado IDispatch de la clase administrada visible para COM. El MDA no se activa cuando QueryInterface es para una interfaz explícita que tiene aplicado el atributo ClassInterfaceAttribute y se implementa explícitamente la clase visible para COM.

Síntomas

Una llamada a QueryInterface que se realiza desde código nativo produce el error COR_E_INVALIDOPERATION HRESULT. El HRESULT podría deberse a que CLR no permite llamadas a QueryInterface que producirían la activación de este MDA.

Causa

CLR no puede permitir llamadas a QueryInterface para la interfaz de clase o la interfaz IDispatch predeterminada de una clase visible para COM que deriva de una clase que no es visible para COM debido a posibles problemas de versiones. Por ejemplo, si se agregan miembros públicos a la clase base que no es visible para COM, los clientes COM existentes que usan la clase derivada podrían interrumpirse porque la vtable de la clase derivada, que contiene los miembros de clase base, se vería alterada por ese cambio. Las interfaces explícitas expuestas a COM no tienen este problema porque no incluyen los miembros base de las interfaces en la vtable.

Solución

No exponga la interfaz de clase. Defina una interfaz explícita y aplíquele el atributo ClassInterfaceAttribute.

Efecto en el Runtime

Este MDA no tiene ningún efecto en el CLR.

Output

El siguiente es un mensaje de ejemplo de una llamada a QueryInterface en una clase visible para COM Derived que deriva de una clase no visible para COM 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.

Configuración

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

Consulte también