IMetaDataEmit::MergeEnd 方法

将以前一次或多次调用 IMetaDataEmit::Merge 指定的所有元数据范围合并到当前范围。

HRESULT MergeEnd ();

参数

此方法没有参数。

备注

此例程会触发将以前调用 IMetaDataEmit::Merge 时指定的所有元数据导入范围实际合并到当前的输出范围中。

下列特殊条件适用于该合并:

  • 始终不会导入模块版本标识符 (MVID),因为它在导入范围中对元数据是唯一的。

  • 不覆盖现有的模块范围的属性。

    如果已经为当前范围设置了模块属性,则不会导入任何模块属性。 但是,如果当前范围中未设置模块属性,则当首次遇到这些属性时,仅会将这些属性导入一次。 如果再次遇到这些模块属性,则将它们视为重复项。 如果在比较所有模块属性(MVID 除外)的值后未发现重复项,将引发错误。

  • 对于类型定义 (TypeDef),不会将任何重复项合并到当前范围中。 将根据每个“完全限定的对象名称 + GUID + 版本号”来检查 TypeDef 对象中是否存在重复项。 如果存在名称或 GUID 的匹配项,而任何其他两个元素都是不同的,则会引发错误。 否则,如果所有这三个项都匹配,则 MergeEnd 将执行粗略检查,以确保这些项确实属于重复项;如果这三个项并非全部匹配,则会引发错误。 此粗略检查将查找以下内容:

    • 以相同顺序发生的相同的成员声明。 此检查中不包括标记为 mdPrivateScope(请参见 CorMethodAttr 枚举)的成员;它们将采用特殊的合并方式。

    • 相同的类布局。

    这意味着,在声明 TypeDef 对象的每个元数据范围中,该对象的定义必须始终是完整且一致的;如果该对象的成员实现(针对某个类)分布在多个编译单元中,将假定每个范围中都存在完整的定义,而并非该定义在每个范围中都是递增的。 例如,如果有多个参数名称与该协定相关,则必须按相同的方式将它们发出到每个范围中;如果它们不相关,则不应将它们发出到元数据中。

    例外情况是,TypeDef 对象可以具有标记为 mdPrivateScope 的增量成员。 在遇到这些成员时,MergeEnd 会以递增方式将它们添加到当前范围中,而不会考虑它们是否为重复项。 这是因为编译器了解私有范围并且必须负责强制其中的规则。

  • 不导入或合并相对虚拟地址 (RVA);编译器应重新发出此信息。

  • 对于自定义特性,仅当合并它们附加到的项时,才会对它们进行合并。 例如,如果自定义特性与某个类相关联,则当首次遇到该类时,将合并这些自定义特性。 如果自定义特性与特定于编译单元(例如成员编译的时间戳)的 TypeDefMemberDef 相关联,将不会合并这些自定义特性,并将由编译器负责移除或更新此类元数据。

要求

**平台:**请参见 .NET Framework 系统要求

**头文件:**Cor.h

**库:**在 MSCorEE.dll 中用作资源

**.NET Framework 版本:**4、3.5 SP1、3.5、3.0 SP1、3.0、2.0 SP1、2.0、1.1

请参见

参考

IMetaDataEmit 接口

IMetaDataEmit2 接口