Marshaling par défaut pour les classes
Les classes peuvent être marshalées uniquement par COM interop et sont toujours marshalées en tant qu'interfaces. Dans certains cas, l'interface utilisée pour marshaler la classe est connue sous le nom d'interface de classe. Pour plus d'informations sur la substitution de l'interface de classe par une interface de votre choix, consultez Présentation de l'interface de classe.
Passage de classes à COM
Lorsqu'une classe managée est passée à COM, le marshaleur d'interopérabilité enveloppe automatiquement la classe à l'aide d'un proxy COM et passe l'interface de classe produite par le proxy à l'appel de méthode COM. Le proxy délègue ensuite tous les appels à l'interface de classe vers l'objet managé. Le proxy expose également d'autres interfaces qui ne sont pas explicitement implémentées par la classe. Le proxy implémente automatiquement les interfaces telles que IUnknown et IDispatch pour le compte de la classe.
Passage de classes au code .NET
Les coclasses ne sont pas généralement utilisées comme arguments de méthode dans COM. Une interface par défaut est généralement passée au lieu de la coclasse.
Lorsqu'une interface est passée à du code managé, le marshaleur d'interopérabilité est chargé d'envelopper l'interface à l'aide du wrapper correct et de passer le wrapper à la méthode managée. Déterminer quel wrapper utiliser peut s'avérer difficile. Chaque instance d'un objet COM possède un seul et unique wrapper, quel que soit le nombre d'interfaces implémenté par l'objet. Par exemple, un seul objet COM qui implémente cinq interfaces distinctes ne possède qu'un seul wrapper. Le même wrapper expose les cinq interfaces. Si deux instances de l'objet COM sont créées, deux instances du wrapper sont créées.
Pour que le wrapper conserve le même type durant sa durée de vie, le marshaleur d'interopérabilité doit identifier le wrapper correct la première fois qu'une interface exposée par l'objet est passée via le marshaleur. Le marshaleur identifie l'objet en examinant l'une des interfaces implémentée par l'objet.
Par exemple, le marshaleur détermine que le wrapper de classe doit être utilisé pour envelopper l'interface passée dans le code managé. Lorsque l'interface est initialement passée via le marshaleur, le marshaleur vérifie si l'interface provient d'un objet connu. Cette vérification se produit dans deux situations :
Une interface est implémentée par un autre objet managé qui a été passé à COM dans un autre endroit. Le marshaleur peut facilement identifier les interfaces exposées par les objets managés et peut faire correspondre l'interface à l'objet managé qui fournit l'implémentation. L'objet managé est ensuite passé à la méthode et aucun wrapper n'est nécessaire.
Un objet qui a déjà été enveloppé implémente l'interface. Afin de déterminer si tel est le cas, le marshaleur interroge l'objet au sujet de son interface IUnknown et compare l'interface retournée aux interfaces des autres objets qui sont déjà enveloppés. Si l'interface est la même que celle d'un autre wrapper, les objets ont la même identité et le wrapper existant est passé à la méthode.
Si une interface ne provient pas d'un objet connu, le marshaleur effectue l'opération suivante :
Le marshaleur interroge l'objet pour l'interface IProvideClassInfo2. Si celle-ci est fournie, le marshaleur utilise le CLSID retourné à partir de IProvideClassInfo2.GetGUID pour identifier la coclasse fournissant l'interface. Avec le CLSID, le marshaleur peut localiser le wrapper à partir de la base de registres si l'assembly a été inscrit précédemment.
Le marshaleur interroge l'interface au sujet de l'interface IProvideClassInfo. Si celle-ci est fournie, le marshaleur utilise le ITypeInfo retourné à partir de IProvideClassInfo.GetClassinfo pour déterminer le CLSID de la classe exposant l'interface. Le marshaleur peut utiliser le CLSID pour localiser les métadonnées du wrapper.
Si le marshaleur ne peut toujours pas identifier la classe, il enveloppe l'interface à l'aide d'une classe de wrapper générique appelée System.__ComObject.
Voir aussi
Concepts
types blittable et non blittable