Équivalence des types et types interop incorporés
À compter de .NET Framework 4, le Common Language Runtime prend en charge l’incorporation des informations de type, pour les types COM, directement dans les assemblys managés. Auparavant, les assemblys managés devaient obtenir ces informations des assemblys interop. Étant donné que les informations de type incorporées incluent uniquement les types et les membres qui sont réellement utilisés par un assembly managé, deux assemblys managés peuvent présenter des affichages très différents du même type COM. Chaque assembly managé a un objet Type différent pour représenter son affichage du type COM. Le Common Language Runtime prend en charge l’équivalence des types entre ces différents affichages pour les interfaces, les structures, les énumérations et les délégués.
Avec l’équivalence des types, un objet COM qui est passé d’un assembly managé à un autre peut être casté en type managé approprié dans l’assembly de réception.
Notes
L’équivalence des types et les types interop incorporés simplifient le déploiement des applications et compléments qui utilisent des composants COM, car cela évite d’avoir à déployer des assemblys interop avec les applications. Les développeurs de composants COM partagés doivent continuer à créer des assemblys PIA (Primary Interop Assemblies) s’ils veulent pouvoir utiliser leurs composants dans des versions de .NET Framework antérieures.
Équivalence des types
L’équivalence des types COM est prise en charge pour les interfaces, les structures, les énumérations et les délégués. Deux types COM sont considérés comme équivalents s’ils remplissent toutes les conditions suivantes :
Les deux types sont des interfaces, des structures, des énumérations ou des délégués.
Les deux types ont la même identité, comme décrit dans la section suivante.
Les deux types sont disponibles pour l’équivalence des types, comme décrit dans la section Marquer des types COM pour l’équivalence des types.
Identité des types
Deux types sont considérés comme ayant la même identité si leurs portées et identités correspondent ou, en d’autres termes, s’ils sont chacun définis avec l’attribut TypeIdentifierAttribute et si les deux attributs ont les mêmes propriétés Scope et Identifier. La comparaison de Scope est effectuée en respectant la casse.
Si un type n’est pas défini avec l’attribut TypeIdentifierAttribute, ou si son attribut TypeIdentifierAttribute ne spécifie pas de portée ni d’identité, le type reste toutefois disponible pour l’équivalence de la manière suivante :
Pour les interfaces, la valeur de l’attribut GuidAttribute est utilisée à la place de la propriété TypeIdentifierAttribute.Scope et la propriété Type.FullName (correspondant au nom de type, avec l’espace de noms) est utilisée à la place de la propriété TypeIdentifierAttribute.Identifier.
Pour les structures, les énumérations et les délégués, l’attribut GuidAttribute de l’assembly conteneur est utilisé au lieu de la propriété Scope et la propriété Type.FullName est utilisée au lieu de la propriété Identifier.
Marquer des types COM pour l’équivalence des types
Vous pouvez marquer un type comme étant disponible pour l’équivalence des types de deux manières :
Appliquez l’attribut TypeIdentifierAttribute au type.
Marquez le type comme type d’importation COM. Une interface est un type d’importation COM si elle a l’attribut ComImportAttribute. Une interface, une structure, une énumération ou un délégué est un type d’importation COM si l’assembly dans lequel ils sont définis a l’attribut ImportedFromTypeLibAttribute.