合并到当前范围中,由一个或多个之前对 IMetaDataEmit::Merge 的调用指定的元数据范围。
Syntax
HRESULT MergeEnd ();
Parameters
此方法不采用任何参数。
Remarks
此例程将触发由上述调用 IMetaDataEmit::Merge指定的所有导入范围的实际元数据合并到当前输出范围。
以下特殊条件适用于合并:
- 从不导入模块版本标识符(MVID),因为它对导入范围内的元数据是唯一的。 
- 不会覆盖现有的模块范围属性。 - 如果已为当前范围设置了模块属性,则不会导入任何模块属性。 但是,如果模块属性尚未在当前范围内设置,则首次遇到模块属性时仅导入一次。 如果再次遇到这些模块属性,则它们是重复的。 如果比较所有模块属性(MVID 除外)的值,并且找不到重复项,则会引发错误。 
- 对于类型定义( - TypeDef),不会将重复项合并到当前范围内。- TypeDef根据每个 完全限定的对象名称 + GUID + 版本号检查对象是否存在重复项。 如果名称或 GUID 上存在匹配项,并且其他两个元素中的任何一个都不同,则会引发错误。 否则,如果这三个项都匹配,- MergeEnd则执行游标检查以确保条目确实重复;否则,将引发错误。 此游标检查查找:- 相同的成员声明以相同的顺序发生。 标记为 - mdPrivateScope(请参阅 CorMethodAttr 枚举)的成员未包含在此检查中;它们专门合并。
- 相同的类布局。 
 - 这意味着 - TypeDef,对象必须始终在声明它的每个元数据范围中完全且一致地定义;如果对象的成员实现(针对某个类)分布在多个编译单元中,则假定整个定义存在于每个范围中,而不是在每个范围内递增。 例如,如果参数名称与协定相关,则必须以相同的方式在每个范围内发出它们;如果它们不相关,则不应将其发送到元数据中。- 例外情况是,对象 - TypeDef可以有标记为- mdPrivateScope增量成员。 遇到这些错误时,- MergeEnd请以增量方式将它们添加到当前范围,而不考虑重复项。 由于编译器了解专用范围,因此编译器必须负责强制实施规则。
- 相对虚拟地址(RVA)未导入或合并;编译器应重新发出此信息。 
- 仅当将自定义属性附加到的项合并时,才会合并自定义属性。 例如,首次遇到类时,将合并与类关联的自定义属性。 如果自定义属性与 - TypeDef- MemberDef编译单元(例如成员编译的时间戳)相关联,则它们不会合并,由编译器来删除或更新此类元数据。
Requirements
平台: 请参阅 .NET 支持的作系统。
Header: Cor.h
Library: CorGuids.lib