Поделиться через


Метод IMetaDataEmit::MergeEnd

Выполняет слияние всех областей метаданных, заданных одним или несколькими предварительными вызовами метода IMetaDataEmit::Merge в ткущей области.

HRESULT MergeEnd ();

Параметры

Этот метод не принимает параметры.

Заметки

Эта процедура включает фактическое слияние метаданных во всех областях импорта, заданных предыдущими вызовами IMetaDataEmit::Merge, в текущей области вывода.

К слиянию применяются следующие особые условия.

  • Идентификатор версии модуля (MVID) никогда не импортируется, поскольку он уникален для метаданных в импортируемой области.

  • Существующие свойства, применимые ко всему модулю, не перезаписываются.

    Если свойства модуля для текущей области уже заданы, свойства модуля не импортируются. Однако если свойства модуля в текущей области не заданы, они импортируются только один раз, когда они встречаются впервые. Если эти свойства модуля встречаются снова, они дублируются. Если при сравнении значений всех свойств модуля (за исключением MVID) не найден ин один дубликат, возникает ошибка.

  • Для определений типа (TypeDef) слияние дубликатов в текущей области не выполняется. Объекты TypeDef проверяются на наличие дубликатов по всем значениям полное_имя_объекта + GUID + номер_версии. Если обнаружено совпадение по имени или по GUID, но при этом два других элемента отличаются, возникает ошибка. В противном случае, если совпадают все три элемента, метод MergeEnd выполняет беглую проверку и определяет, действительно ли записи являются дубликатами; если это не так, возникает ошибка. Во время этой беглой проверки определяется выполнение следующих условий.

    • Объявления одних и тех же членов расположены в одинаковом порядке. Члены, отмеченные такими флагами, как mdPrivateScope (см. описание перечисления CorMethodAttr), в эту проверку не включаются; их слияние выполняется особым образом.

    • Структура классов совпадает.

    Это означает, что объект TypeDef должен быть всегда полностью и единообразно определен во всех областях метаданных, в которых он объявлен; если его реализация члена (для класса) распространяется на несколько блоков компиляции, предполагается, что полное определение не добавляется в каждую область, а присутствует сразу во всех областях. Например, если для контракта важны имена параметров, они должны выдавать одинаково во всех областях; если эти имена не важны, они не должны выдаваться в метаданные.

    Исключением является допустимость присутствия в объекте TypeDef добавочных членов, отмеченных флагом mdPrivateScope. Когда встречаются такие члены, метод MergeEnd поочередно добавляет их в текущую область, невзирая на дубликаты. Поскольку компилятор распознает закрытую область, за обеспечение выполнения правил должен отвечать именно он.

  • Относительные виртуальные адреса (RVA) не импортируются и не сливаются; предполагается, что компилятор выдаст эти сведения повторно.

  • Слияние пользовательских атрибутов выполняется только при слиянии элементов, в которые они вложены. Например, слияние пользовательских атрибутов, связанных с классом, выполняется, когда класс встречается в первый раз. Если пользовательские атрибуты связаны с маркером TypeDef или MemberDef, которые характерны для блока компиляции (например, отметки времени компиляции члена), они не сливаются и компилятор сам решает удалить или обновить эти данные.

Требования

Платформы: см. раздел Требования к системе для .NET Framework.

Заголовок: Cor.h

Библиотека: используется как ресурс в MSCorEE.dll

Версии платформы .NET Framework: 4, 3.5 с пакетом обновления 1 (SP1), 3.5, 3.0 с пакетом обновления 1 (SP1), 3.0, 2.0 с пакетом обновления 1 (SP1), 2.0, 1.1

См. также

Ссылки

Интерфейс IMetaDataEmit

Интерфейс IMetaDataEmit2