在 C# 程序集中,元数据头和元数据表分别承担哪些职责?它们如何协同支撑程序集的元数据描述?
考察说明
考查对 C# 程序集元数据内部结构的理解,以及元数据头与元数据表在运行时和编译层面的作用。
回答思路
- 【回答框架 1】元数据头是程序集元数据的起始部分,包含元数据版本、标志、流声明及流头偏移等关键信息,用于定位和解析后续的元数据流。它相当于元数据的目录索引。
- 【回答框架 2】元数据表则按类型分组存储具体的元数据记录,例如模块表、类型定义表、字段表、方法表等,每条记录描述程序集中的一个逻辑元素及其属性、引用关系。
- 【回答框架 3】元数据头通过流头将各种流(如字符串堆、Blob 堆、GUID 堆)与表关联起来,运行时的加载器依据表头和堆数据实现类型的加载、字段访问与方法调用。
- 【回答框架 4】这样既实现了自描述,又支持跨语言互操作和反射。编译时生成,运行时可被 CLR 校验和读取,保证程序集的类型安全与版本一致性。
- 【关键点 1】元数据头是元数据的入口,记录版本、标志、流声明和偏移。
- 【关键点 2】元数据表分门别类存储类型、方法、字段等元数据记录。
- 【关键点 3】二者配合使程序集自描述,支撑反射、跨语言互操作和 CLR 加载校验。
- 【易错点 1】不要把元数据头理解为独立的元数据信息,它只是索引和定位信息。
- 【易错点 2】避免混淆元数据表和元数据流,表是逻辑概念,流是存储形式。
- 【易错点 3】不要认为元数据头存储实际数据,实际数据在堆中,头只提供偏移。