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>