MDA de nonComVisibleBaseClass
Actualización: noviembre 2007
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.
Resultados
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
Conceptos
Diagnóstico de errores con ayudantes de depuraciones administradas
Información general acerca del cálculo de referencia de interoperabilidad