元数据 API 概述

更新:2007 年 11 月

公共语言运行库 (CLR) 元数据 API 允许在运行库不加载类的情况下访问组件的元数据。API 专门用于使性能最大,使系统开销最小。通过使用元数据引擎,可以获得数据,但不能直接访问内存中的数据结构。相反,在运行时加载某个类以后,加载程序会将元数据导入自己的数据结构中,您可以使用运行库的反射服务进行浏览。

元数据 API 与反射服务

反射服务所做的工作比元数据 API 所做的工作多得多。例如,它们可以自动浏览继承层次结构以获得继承方法和继承字段的相关信息。元数据 API 仅返回给定类的直接成员声明,并需要 API 客户端执行附加调用以浏览层次结构并枚举继承方法。反射服务方法公开了一个较高级别的元数据视图,而元数据 API 方法使 API 客户端可以完全控制数据结构的浏览。

范围

在任意给定的时间,都可能存在多个包含元数据的不同内存区域。例如,可能有一个区域映射了磁盘上现有模块中的所有元数据。同时,您可能要将元数据发往一个单独区域,该区域以后将作为模块保存到文件中。

说明:

此处,“模块”一词是指包含元数据的文件。通常,模块将是既包含元数据又包含 Microsoft 中间语言 (MSIL) 代码的 .obj、.exe 或 .dll 文件,但模块也可以是仅包含元数据的文件。

内存中每个单独的元数据区域称为一个“范围”。每个范围都对应于一个模块。模块通常以文件的形式保存在磁盘上,但并不是非这样不可。例如,脚本撰写工具生成的元数据通常不保留在文件中。

使用术语“范围”的原因是该术语表示在其中定义元数据标记的区域。例如,值为 N 的元数据标记标识有关给定范围内某个类定义的详细信息。但是,在不同的范围内,即使元数据标记具有相同的值 N,也可能对应于完全不同的详细信息集。

若要在内存中建立元数据范围,请调用 IMetaDataDispenser 接口的 CComPtrBase::CoCreateInstance 方法。此方法将创建一个新范围,或者从文件或内存位置中打开现有的元数据结构集。每次调用 IMetaDataDispenser::DefineScopeIMetaDataDispenser::OpenScope 方法时,调用方都会指定用于接收信息的 API:

错误检查

元数据 API 执行最低限度的语义错误检查。元数据 API 方法假定发出元数据的工具和服务将强制执行通用类型系统中概述的对象系统规则,并假定元数据引擎在开发时执行的任何附加检查都是多余的。

请参见

其他资源

元数据概述