IMetaDataEmit::MergeEnd 方法

合并到当前范围中由一个或多个之前的 IMetaDataEmit::Merge 调用指定的所有元数据范围。

语法

HRESULT MergeEnd ();

参数

此方法不采用参数。

注解

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

以下特殊条件适用于合并:

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

  • 不会覆盖任何现有的模块范围内的属性。

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

  • 对于类型定义 (TypeDef),不会将任何重复项合并到当前范围中。 针对每个完全限定的对象名称 + GUID + 版本号 检查 TypeDef 对象是否存在重复项。 如果名称或 GUID 上存在匹配项,并且其他两个元素的任何一个是不同的,则会引发错误。 否则,如果所有三项都匹配,MergeEnd 则进行游标检查以确保条目确实是重复的;否则,将引发错误。 此游标检查会查找:

    • 同一成员声明,以相同的顺序发生。 标记为 mdPrivateScope 的成员(请参阅 CorMethodAttr 枚举)不包括在此检查中;它们是专门合并的。

    • 相同的类布局。

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

    例外情况是 TypeDef 对象可以将增量成员标记为 mdPrivateScope。 遇到这些时,MergeEnd 以增量方式将它们添加到当前范围,而不考虑重复项。 由于编译器了解专用范围,因此编译器必须负责强制实施规则。

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

  • 只有在将自定义属性附加到的项合并时才合并自定义属性。 例如,首次遇到类时,将合并与类关联的自定义属性。 如果自定义属性与特定于编译单元(例如成员编译的时间戳)的 TypeDefMemberDef 相关联,则它们不会合并,由编译器删除或更新此类元数据。

要求

平台:请参阅系统要求

标头:Cor.h

库:用作 MSCorEE.dll 中的资源

.NET Framework 版本:1.1 及更高版本

另请参阅