nonComVisibleBaseClass (MDA)
Remarque
Cet article est spécifique au .NET Framework. Elle ne s’applique pas aux implémentations plus récentes de .NET, notamment .NET 6 et versions ultérieures.
L'Assistant Débogage managé (MDA) nonComVisibleBaseClass
est activé quand un appel QueryInterface
est effectué par du code natif ou non managé sur le wrapper CCW (COM Callable Wrapper) d'une classe managée visible par COM qui dérive d'une classe de base qui ne l'est pas. L'appel QueryInterface
provoque l'activation de l'Assistant Débogage managé uniquement dans les cas où l'appel demande l'interface de classe ou l'interface IDispatch
par défaut de la classe managée visible par COM. L'Assistant Débogage managé n'est pas activé si QueryInterface
concerne une interface explicite à laquelle est appliqué l'attribut ClassInterfaceAttribute et qui est implémentée explicitement par la classe visible par COM.
Symptômes
Un appel QueryInterface
effectué à partir du code natif échoue (erreur COR_E_INVALIDOPERATION HRESULT). L'erreur HRESULT peut être due au refus des appels QueryInterface
par le runtime, provoquant ainsi l'activation de cet Assistant Débogage managé.
Cause
Pour éviter des problèmes de version potentiels, le runtime n'autorise pas les appels QueryInterface
pour l'interface de classe ou l'interface IDispatch
par défaut d'une classe visible par COM dérivant d'une classe qui n'est pas visible par COM. Si, par exemple, des membres publics étaient ajoutés à la classe de base non visible par COM, les clients COM existants utilisant la classe dérivée pourraient être interrompus, car la table vtable de la classe dérivée qui contient les membres de la classe de base serait modifiée. Les interfaces explicites exposées à COM ne rencontrent pas ce problème dans la mesure où elles n'incluent pas les membres de base des interfaces de vtable.
Résolution
N'exposez pas l'interface de classe. Définissez une interface explicite et appliquez-lui l'attribut ClassInterfaceAttribute.
Effet sur le runtime
Cet Assistant Débogage managé n'a aucun effet sur le CLR.
Sortie
La sortie ci-dessous est un exemple de message qui est retourné après un appel QueryInterface
effectué sur une classe Derived
visible par COM dérivant d'une classe Base
non visible par 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.
Configuration
<mdaConfig>
<assistants>
<nonComVisibleBaseClass />
</assistants>
</mdaConfig>