元数据是由几个表构成的二进制数据块。有三种表,分别是定义表(definition table)、引用表(reference table)和清单表(manifest table)
1,常用的元数据定义表
元数据定义名称 | 说明 |
ModuleDef | 总是包含对模块进行标识的一个记录项; 包含:模块文件名,扩展名(不含路径),模块版本ID(编译器创建的GUID) |
TypeDef | 模块定义的每个类型在这个表中都有一个记录项; 包含:类型的名称,基类型,标志(public等),索引(索引指向MethodDef表中该类型的方法,FieldDef表中该类型的字段,PropertyDef表中该类型的属性,EventDef表中该类型的事件) |
MethodDef | 模块定义的每个方法在这个保重都有一个记录项; 包含:方法的名称,标志,签名,方法的IL代码在模块中的偏移量。每个记录项还引用了ParamDef表中的一个记录项,后者包括与方法参数有关的更多信息 |
FieldDef | 模块定义了每个字段在这个表中都有一个记录项; 包含:标志,类型,名称 |
ParamDef | 模块定义的每个参数在这个表中都有一个记录项; 包含:标志(in,out,retval等),类型,名称 |
PropertyDef | 模块定义的每个属性在这个表中都有一个记录项; 包含:标志,类型,名称 |
EventDef | 模块定义的每个事件在这个表中都有一个记录项; 包括:标志,名称 |
2,常用的引用元数据表
引用元数据的名称 | 说明 |
AssemblyRef | 模块引用的每个程序集在这个表中都有一个记录项; 包含:程序集名(不包含路径和扩展名),版本号,语言文化,公钥token,标志(flag),哈希值 |
ModuleRef | 实现该模块所引用的类型的的每个PE模块在这个表中都有一个记录项; 包含:模块的文件名,扩展名(不含路径) |
TypeRef | 模块引用的每个类型在这个表中都有一个记录项; 包含:类型的名称,一个引用(指向类型的位置) |
MemberRef | 模块引用的每个成员(字段和方法以及属性方法和事件方法)在这个表中都有一个记录项; 包含:成员的名称,签名,并指向对成员进行定义的那个类型的TypeRef记录项 |
3,清单元数据表
清单元数据表名称 | 说明 |
AssemblyDef | 如果模块标识的是程序集,这个元数据表就包含单一记录项来列出程序集名称(不含路径和扩展名),版本(major,minor,build和revision),语言文化(culture),一些标志(flag),哈希算法以及发布者公钥(可为null) |
FieldDef | 作为程序集一部分的每个PE文件和资源文件在这个表中都有一个记录项(清单本身所在的文件除外,该文件在AssemplyDef表的单一记录项中列出); 包含:文件名,扩展名(不含路径),哈希值和一些标志(flags); 如果程序集只包含它自己的文件,FileDef表将无记录 |
ManifestResourceDef | 作为程序集一部分的每个资源在这个表中都有一个记录项; 包含:资源名称,标志,FileDef表的一个索引,偏移量(指出资源在PE文件中的起始位置) |
ExportedTypesDef | 从程序集的所有PE模块中导出的每个public类型在这个表中都有一个记录项; 包含:类型名称,FileDef表的一个索引,TypeDef表的一个索引 |
4,利用ILDasm.exe查看元数据
视图-》元信息-》显示