IMetaDataEmit::MergeEnd-Methode
Führt sämtliche Metadatenbereiche, die durch einen oder mehrere vorausgehende Aufrufe von IMetaDataEmit::Merge angegeben wurden, im aktuellen Bereich zusammen.
HRESULT MergeEnd ();
Parameter
Diese Methode verwendet keine Parameter.
Hinweise
Diese Routine löst das eigentliche Zusammenführen der Metadaten (aller Importbereiche, die von vorhergehenden Aufrufen von IMetaDataEmit::Merge angegeben wurden) in den aktuellen Ausgabebereich aus.
Die folgenden besonderen Bedingungen gelten für die Zusammenführung:
Ein Modulversionsbezeichner (MVID) wird nie importiert, da er für die Metadaten im Importbereich eindeutig ist.
Keine vorhandenen modulweiten Eigenschaften werden überschrieben.
Wenn Moduleigenschaften bereits für den aktuellen Bereich festgelegt wurden, werden keine Moduleigenschaften importiert. Wurden im aktuellen Bereich jedoch keine Moduleigenschaften festgelegt, werden sie nur einmal beim ersten Auftreten importiert. Wenn diese Moduleigenschaften noch einmal auftreten, sind sie Duplikate. Wenn die Werte aller Moduleigenschaften (außer MVID) verglichen und keine Duplikate gefunden werden, wird ein Fehler ausgelöst.
Für Typdefinitionen (TypeDef) werden keine Duplikate mit dem aktuellen Bereich zusammengeführt. TypeDef-Objekte werden mit jedem vollqualifizierten Objektnamen + GUID + Versionsnummer auf Duplikate überprüft. Wenn es bei Namen oder GUID eine Übereinstimmung gibt und eins der anderen beiden Elemente abweicht, wird ein Fehler ausgelöst. Wenn hingegen alle drei Elemente übereinstimmen, führt MergeEnd eine flüchtige Prüfung durch, um sicherzustellen, das die Einträge tatsächlich Duplikate sind. Ist dies nicht der Fall, wird ein Fehler ausgelöst. Bei dieser flüchtigen Prüfung wird nach Folgendem gesucht:
Gleiche Memberdeklarationen, die in der gleichen Reihenfolge auftreten. Member, die als mdPrivateScope gekennzeichnet sind (vgl. die CorMethodAttr-Enumeration) werden nicht in diese Prüfung einbezogen. Sie werden auf besondere Weise zusammengeführt.
Gleiches Klassenlayout.
Das heißt, ein TypeDef-Objekt muss immer vollständig und konsistent in jedem Metadatenbereich definiert sein, in dem es deklariert ist. Wenn seine Memberimplementierungen (für eine Klasse) über mehrere Kompilierungseinheiten verteilt sind, wird davon ausgegangen, dass die Definition nicht inkrementell pro Bereich vorliegt, sondern in jedem Bereich vollständig vorhanden ist. Wenn z. B. Parameternamen für den Vertrag relevant sind, müssen sie auf die gleiche Weise in jeden Bereich ausgegeben werden. Sind sie nicht relevant, sollten sie nicht in Metadaten ausgegeben werden.
Die Ausnahme besteht darin, dass ein TypeDef-Objekt inkrementelle Member haben kann, die als mdPrivateScope gekennzeichnet sind. Wenn MergeEnd auf sie trifft, werden sie ohne Berücksichtigung von Duplikaten inkrementell zum aktuellen Bereich hinzugefügt. Da der Compiler den privaten Bereich versteht, muss er für die Durchsetzung von Regeln verantwortlich sein.
Relative virtuelle Adressen (RVAs) werden nicht importiert oder zusammengeführt. Es wird erwartet, dass der Compiler diese Informationen erneut ausgibt.
Benutzerdefinierte Attribute werden nur zusammengeführt, wenn das Element, an das sie angefügt sind, zusammengeführt wird. So werden z. B. benutzerdefinierte Attribute, die mit einer Klasse verknüpft sind, beim ersten Auftreten der Klasse zusammengeführt. Wenn benutzerdefinierte Attribute einer TypeDef oder MemberDef zugeordnet sind, die für die Kompilierungseinheit spezifisch ist (z. B. der Zeitstempel einer Memberkompilierung), werden sie nicht zusammengeführt, und der Compiler muss diese Metadaten entfernen oder aktualisieren.
Anforderungen
Plattformen: siehe Systemanforderungen für .NET Framework.
Header: Cor.h
Bibliothek: als Ressource in MSCorEE.dll verwendet
.NET Framework-Versionen: 4, 3.5 SP1, 3.5, 3.0 SP1, 3.0, 2.0 SP1, 2.0, 1.1