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