Compartir a través de


MDA de nonComVisibleBaseClass

El asistente para la depuración administrada (MDA) nonComVisibleBaseClass se activa cuando se realiza una llamada QueryInterface por código nativo o no administrado en el contenedor COM invocable (CCW) de una clase administrada visible a través de COM que deriva de una clase base que no está visible por COM. La llamada a la QueryInterface hace que el MDA se active sólo en casos en que la llamada solicita que la interfaz de clase o la IDispatch predeterminada de la clase administrada visible a través de COM. El MDA no se activa cuando la QueryInterface es para una interfaz explícita que tiene aplicado el atributo ClassInterfaceAttribute y está explícitamente implementado por la clase visible a través de COM.

Síntomas

Una llamada a QueryInterface realizada desde código nativo que falla por un error COR_E_INVALIDOPERATION HRESULT. El HRESULT podría deberse a que el motor en tiempo de ejecución deniega las llamadas a QueryInterface que producirían la activación de este MDA.

Motivo

El motor en tiempo de ejecución no puede permitir llamadas a QueryInterface para la interfaz de clase o a la interfaz IDispatch predeterminada de una clase visible a través de COM que deriva de una clase que no es visible a través de COM a causa de posibles problemas de versiones. Por ejemplo, si se agregó algún miembro público a la clase base que no es visible a través de COM, los clientes COM existentes que utilizan la clase derivada podrían interrumpirse porque la tabla vtable de la clase derivada, que contiene los miembros de la 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 interfaces contenidos en la tabla vtable.

Resolución

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

Efecto en el tiempo de ejecución

Este MDA no tiene ningún efecto en CLR.

Output

Lo siguiente es un mensaje de ejemplo para una llamada QueryInterface en una clase visible a través de COM Derived que deriva de una clase Base no visible a través de COM.

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>

Vea también

Referencia

MarshalAsAttribute

Conceptos

Diagnóstico de errores con ayudantes de depuraciones administradas

Cálculo de referencias de interoperabilidad

Otros recursos

Interoperabilidad