Partager via


IMetaDataEmit::MergeEnd, méthode

Fusionne dans la portée actuelle toutes les portées des métadonnées spécifiées par un ou plusieurs appels antérieurs à IMetaDataEmit::Merge.

Syntaxe

HRESULT MergeEnd ();

Paramètres

Cette méthode ne prend aucun paramètre.

Notes

Cette routine déclenche la fusion réelle des métadonnées de toutes les portées d’importation spécifiées par des appels précédents à IMetaDataEmit::Merge dans la portée de sortie actuelle.

Les conditions spéciales suivantes s’appliquent à la fusion :

  • Un identificateur de version de module (MVID) n’est jamais importé, car il est propre aux métadonnées dans la portée d’importation.

  • Aucune propriété existante à l’échelle du module n’est remplacée.

    Si des propriétés de module ont déjà été définies pour la portée actuelle, aucune propriété de module n’est importée. Toutefois, si des propriétés du module n’ont pas été définies dans la portée actuelle, elles ne sont importées que quand elles sont rencontrées pour la première fois. Si ces propriétés de module sont à nouveau rencontrées, il s’agit de doublons. Si les valeurs de toutes les propriétés de module (à l’exception de MVID) sont comparées et qu’aucun doublon n’est trouvé, une erreur est générée.

  • Pour les définitions de type (TypeDef), aucun doublon n’est fusionné dans la portée actuelle. Les objets TypeDef sont vérifiés en lien avec les doublons par rapport à chaque nom d’objet complet + GUID + numéro de version. S’il existe une correspondance de nom ou de GUID, et que l’un des deux autres éléments est différent, une erreur est générée. Autrement, si les trois éléments correspondent, MergeEnd effectue une vérification de curseur pour s’assurer que les entrées sont effectivement dupliquées, sans quoi une erreur est levée. Cette vérification de curseur recherche :

    • Les mêmes déclarations de membre se produisant dans le même ordre. Les membres marqués comme mdPrivateScope (voir l’énumération CorMethodAttr) ne sont pas inclus dans cette vérification, mais fusionnés de façon particulière.

    • La même disposition de classe.

    Cela signifie qu’un objet TypeDef doit toujours être défini de manière complète et cohérente dans chaque portée de métadonnées dans laquelle il est déclaré. Si ses implémentations de membres (pour une classe) sont réparties dans plusieurs unités de compilation, la définition complète, non incrémentielle, est supposée être présente dans chaque portée. Par exemple, si les noms de paramètres sont pertinents pour le contrat, ils doivent être émis de la même façon dans chaque portée ; s’ils ne sont pas pertinents, ils ne doivent pas être émis dans les métadonnées.

    L’exception est qu’un objet TypeDef peut avoir des membres incrémentiels marqués comme mdPrivateScope. En cas de rencontre de ceux-ci, MergeEnd les ajoute de manière incrémentielle à la portée actuelle sans tenir compte des doublons. Étant donné que le compilateur comprend la portée privée, il doit être responsable de l’application des règles.

  • Les adresses virtuelles relatives (RVA) ne sont pas importées ou fusionnées, le compilateur étant censé réémettre ces informations.

  • Des attributs personnalisés ne sont fusionnés qu’en cas de fusion de l’élément auquel ils sont attachés. Par exemple, les attributs personnalisés associés à une classe sont fusionnés quand celle-ci est rencontrée pour la première fois. Si des attributs personnalisés sont associés à un TypeDef ou MemberDef spécifiques de l’unité de compilation (par exemple, l’horodatage d’une compilation de membre), ils ne sont pas fusionnés et il incombe au compilateur de supprimer ou de mettre à jour de telles métadonnées.

Spécifications

Plateformes : Consultez Configuration requise.

En-tête : Cor.h

Bibliothèque : utilisée en tant que ressource dans MSCorEE.dll

Versions de .NET Framework : disponible depuis la version 1.1

Voir aussi