IMetaDataEmit::MergeEnd Method

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

Syntax

HRESULT MergeEnd ();

Parameters

此方法不采用任何参数。

Remarks

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

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

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

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

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

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

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

    • 相同的类布局。

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

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

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

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

Requirements

平台: 请参阅 .NET 支持的作系统

Header: Cor.h

Library: CorGuids.lib

See also