Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Note
Cet article est spécifique à .NET Framework. Ceci ne s’applique pas aux implémentations plus récentes de .NET, y compris .NET 6 et versions ultérieures.
L’Assistant nonComVisibleBaseClass débogage managé (MDA) est activé lorsqu’un QueryInterface appel est effectué par du code natif ou non managé sur le wrapper com pouvant être appelé (CCW) d’une classe managée visible par COM qui dérive d’une classe de base qui n’est pas COM visible. L’appel QueryInterface entraîne l’activation du MDA uniquement dans les cas où l’appel demande l’interface de classe ou la valeur par défaut IDispatch de la classe managée visible par COM. Le MDA n’est pas activé quand il QueryInterface s’agit d’une interface explicite qui a l’attribut ClassInterfaceAttribute appliqué et est explicitement implémenté par la classe visible PAR COM.
Symptoms
Appel QueryInterface effectué à partir du code natif qui échoue avec un COR_E_INVALIDOPERATION HRESULT. Le HRESULT peut être dû à l’interdiction QueryInterface d’exécution des appels qui entraîneraient l’activation de ce MDA.
Cause
Le runtime ne peut pas autoriser les QueryInterface appels pour l’interface de classe ou l’interface par défaut IDispatch d’une classe visible par COM qui dérive d’une classe qui n’est pas visible par COM en raison de problèmes potentiels de contrôle de version. Par exemple, si des membres publics ont été ajoutés à la classe de base qui n’est pas visible par COM, les clients COM existants utilisant la classe dérivée pourraient potentiellement s’interrompre, car la table virtuelle de la classe dérivée, qui contient les membres de classe de base, serait modifiée par une telle modification. Les interfaces explicites exposées à COM n’ont pas ce problème, car elles n’incluent pas les membres de base des interfaces dans la table virtuelle.
Résolution
N’exposez pas l’interface de classe. Définissez une interface explicite et appliquez-lui l’attribut ClassInterfaceAttribute .
Effet sur le runtime
Ce MDA n’a aucun effet sur le CLR.
Sortie
Voici un exemple de message pour un QueryInterface appel sur une classe Derived COM visible qui dérive d’une classe Basenon visible 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>