Partager via


nonComVisibleBaseClass (MDA)

L'Assistant Débogage managé (MDA, Managed Debugging Assistant) nonComVisibleBaseClass est activé lorsqu'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é lorsque QueryInterface concerne une interface explicite dont l'attribut ClassInterfaceAttribute est appliqué et qui est explicitement implémentée par la classe visible par COM.

Symptômes

Un appel QueryInterface effectué à partir du code natif échoue avec COR_E_INVALIDOPERATION HRESULT. HRESULT peut être dû au refus des appels QueryInterface par le runtime, ce qui peut provoquer l'activation de cet Assistant Débogage managé.

Cause

Le runtime ne peut pas autoriser des 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 en raison de problèmes de version potentiels. Si, par exemple, des membres publics étaient ajoutés à la classe de base qui n'est pas visible par COM, les clients COM existants utilisant la classe dérivée sont susceptibles d'ê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.

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

L'exemple ci-dessous illustre un message d'un appel QueryInterface sur une classe Derived visible par COM, qui dérive 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>

Voir aussi

Référence

MarshalAsAttribute

Concepts

Diagnostic d'erreurs avec les Assistants de débogage managés

Marshaling d'interopérabilité

Autres ressources

Interopérabilité