元数据概述
元数据用于描述公共语言运行时 (CLR) 使用的运行时类型(类、接口和值类型)、字段、方法以及内部实现和布局信息。 该运行时使用元数据 JIT 编译 Microsoft 中间语言 (MSIL)、加载类、执行代码以及与 COM 传统型或本机领域进行交互。 元数据包括在每个 CLR 组件中,并可供运行时、工具和服务使用。
本概述包含以下几节:
元数据 API
与反射服务比较
范围
错误检查
相关主题
元数据 API
对元数据的所有操作都通过元数据 API 执行,该 API 将客户端(工具和服务)与基础数据结构隔离。 元数据 API 提供一种可插入的持久性格式,这种格式允许运行时的二进制表示形式、COM 传统型类型库和其他格式以透明方式出入内存。
元数据 API 包括发出(即生成)和导入元数据的接口。 客户端可通过下列方式发出或导入元数据:
编译器和工具通过调用发出 API 发出元数据。 元数据在编译和链接过程中发出。 在生成组件或应用程序的过程中,RAD 工具将发出元数据。 API 成员向内存中数据结构写入数据并从中读取数据。 在保存时,这些内存中结构将被压缩并以二进制格式保存到目标编译单元(.obj 文件)、可执行 (.exe) 文件或独立元数据二进制文件中。 在通过链接多个编译单元来形成 EXE 或 DLL 文件时,发出 API 成员将提供相应的方法,用于将每个编译单元中的元数据节合并为一个集成的元数据二进制文件。
在导入元数据时,加载程序及其他运行时工具和服务将调用 API 成员来获取有关组件的信息,以便可以完成加载和激活等任务。
返回页首
与反射服务比较
元数据 API 允许在运行时不加载类的情况下访问组件的元数据。 API 专门用于使性能最大,使系统开销最小。 通过使用元数据引擎,可以获得数据,但不能直接访问内存中的数据结构。 相反,在运行时加载某个类以后,加载程序会将元数据导入自己的数据结构中,您可以使用运行时的反射服务进行浏览。
反射服务所做的工作比元数据 API 所做的工作多得多。 例如,它们可以自动浏览继承层次结构以获得继承方法和继承字段的相关信息。 元数据 API 仅返回给定类的直接成员声明,并需要 API 客户端执行附加调用以浏览层次结构并枚举继承方法。 反射服务方法公开了一个较高级别的元数据视图,而元数据 API 方法使 API 客户端可以完全控制数据结构的浏览。
返回页首
范围
在任意给定的时间,都可能存在多个包含元数据的不同内存区域。 例如,可能有一个区域映射了磁盘上现有模块中的所有元数据。 同时,您可能要将元数据发往一个单独区域,该区域以后将作为模块保存到文件中。
注意 |
---|
此处,“模块”一词是指包含元数据的文件。通常,模块将是既包含元数据又包含 Microsoft 中间语言 (MSIL) 代码的 .obj、.exe 或 .dll 文件,但模块也可以是仅包含元数据的文件。 |
内存中每个单独的元数据区域称为一个“范围”。 每个范围都对应于一个模块。 模块通常以文件的形式保存在磁盘上,但并不是非这样不可。 例如,脚本撰写工具生成的元数据通常不保留在文件中。
使用术语“范围”的原因是该术语表示在其中定义元数据标记的区域。 例如,值为 N 的元数据标记标识有关给定范围内某个类定义的详细信息。 但是,在不同的范围内,即使元数据标记具有相同的值 N,也可能对应于完全不同的详细信息集。
若要在内存中建立元数据范围,请调用 IMetaDataDispenser 接口的 CComPtrBase::CoCreateInstance 方法。 此方法将创建一个新范围,或者从文件或内存位置中打开现有的元数据结构集。 每次调用 IMetaDataDispenser::DefineScope 或 IMetaDataDispenser::OpenScope 方法时,调用方都会指定用于接收信息的 API:
IMetaDataEmit 接口允许工具向元数据范围写入数据。
IMetaDataImport 接口允许工具从元数据范围读取数据。
返回页首
错误检查
元数据 API 执行最低限度的语义错误检查。 元数据 API 方法假定发出元数据的工具和服务将强制执行常规类型系统中概述的对象系统规则,并假定元数据引擎在开发时执行的任何附加检查都是多余的。
返回页首
相关主题
标题 |
说明 |
---|---|
提供有关用于标识抽象内容的元数据标记的信息,并说明如何将其与元数据 API 配合使用。 |
|
描述元数据 API 使用的编码约定。 |
|
描述一些非托管接口,通过这些接口可访问由 .NET Framework 类型、方法、字段等公开的元数据。 |
|
描述元数据 API 使用的非托管全局静态函数。 |
|
描述元数据 API 使用的非托管枚举。 |
|
描述元数据 API 使用的非托管结构。 |
|
描述元数据 API 使用的非托管联合。 |
返回页首