Partager via


IMetaDataEmit::MergeEnd, méthode

Fusionne dans la portée actuelle toutes les portées de métadonnées spécifiées par un ou plusieurs appels précédents à IMetaDataEmit::Merge.

HRESULT MergeEnd ();

Paramètres

Cette méthode n'accepte pas de paramètres.

Notes

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

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

  • Un MVID n'est jamais importé, car il est propre aux métadonnées dans la portée d'importation.

  • Aucune propriété de module existante n'est remplacée.

    Si les 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 les propriétés de module n'ont pas été définies dans la portée actuelle, elles sont importées une seule fois, la première fois où elles sont rencontrées. Si ces propriétés de module sont de nouveau rencontrées, il s'agit de doublons. Si les valeurs de toutes les propriétés de module (sauf MVID) sont comparées et qu'aucun doublon n'est trouvé, une erreur est déclenchée.

  • Pour les définitions de type (TypeDef), aucun doublon n'est fusionné dans la portée actuelle. Des doublons sont recherchés dans les objets TypeDef pour chaque nom qualifié complet d'objet + GUID + numéro de version. S'il existe une correspondance sur le nom ou le GUID, et que les deux autres éléments soient différents, une erreur est déclenchée. Si les trois éléments correspondent, MergeEnd exécute un contrôle rapide pour vérifier que les entrées sont des doublons ; si ce n'est pas le cas, une erreur est déclenchée. Ce contrôle rapide vérifie les points suivants :

    • Les mêmes déclarations de membre, qui se produisent dans le même ordre. Les membres qui sont signalés comme mdPrivateScope (consultez l'énumération CorMethodAttr) ne sont pas inclus dans ce contrôle ; ils font l'objet d'une fusion spéciale.

    • La même disposition de classe.

    Cela signifie qu'un objet TypeDef doit toujours être défini de façon 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 sur plusieurs unités de compilation, la définition complète est supposée être dans chaque portée, et non incrémentielle à chaque portée. Par exemple, si des noms de paramètres sont pertinents pour le contrat, ils doivent être émis de la même manière dans chaque portée ; s'ils ne sont pas pertinents, ils ne doivent pas être émis dans les métadonnées.

    Il existe une exception : un objet TypeDef peut avoir des membres incrémentiels signalés comme mdPrivateScope. Lorsqu'il les rencontre, MergeEnd les ajoute de façon 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 RVA (Relative Virtual Address) ne sont pas importées ou fusionnées ; le compilateur doit émettre de nouveau ces informations.

  • Les attributs personnalisés sont fusionnés uniquement lorsque l'élément auquel ils sont associés est fusionné. Par exemple, les attributs personnalisés associés à une classe sont fusionnés la première fois que la classe est rencontrée. Si les attributs personnalisés sont associés à un objet TypeDef ou MemberDef qui est spécifique à l'unité de compilation (tel que l'horodatage d'une compilation membre), ils ne sont pas fusionnés et le compilateur peut choisir de supprimer ou de mettre à jour ce type de métadonnées.

Configuration requise

Plateformes : consultez Configuration requise du .NET Framework.

En-tête : Cor.h

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

Versions du .NET Framework : 4, 3.5 SP1, 3.5, 3.0 SP1, 3.0, 2.0 SP1, 2.0, 1.1

Voir aussi

Référence

IMetaDataEmit, interface

IMetaDataEmit2, interface