clr相关编译器编译生成的托管模块由四部分组成:PE32或32+头、clr头、元数据、IL代码。

  元数据和IL代码完全对应,保持一致(:>)性。

  元数据有很多用途

    VS的智能感知,自动补全;

    代码验证保证类型安全;

    序列化、反序列化;

    垃圾回收(从元数据得知哪些根引用了对象)。

  元数据包含两类表,一种描述源代码中定义的类型和成员;另一种描述代码引用的类型和成员。模块内部的一些元数据表的大小和偏移量在clr头中会有包含。

  元数据是由几个表构成的二进制数据块。有三种表:定义表、引用表、清单表。

  常用元数据定义表(定义于模块中的):

    ModuleDef : 一个记录项。包含模块名、扩展名和模块版本ID(编译器创建的GUID);

    TypeDef : 每个类型一个记录项。包含类型名称、基类型、一些标志(public,private等)以及一些索引(指向MethodDef表中该类型的方法、FieldDef表中该类型的字段、PropertyDef表中该类型的属性以及EventDef表中该类型的事件);

    MethodDef : 每个方法一个记录项。包含方法的名称、一些标志(private,public,virtual,abstract,static,final等)、签名以及方法的IL代码在模块中的偏移量。每个记录项还引用了ParamDef表中的记录项;

    FieldDef : 每个字段一个记录项。包含标志(public,private等)、类型和名称;

    ParamDef : 每个参数一个记录项。包含标志(in,out,retval等)、类型和名称;

    PropertyDef : 每个属性一个记录项。包含标志、类型和名称。

    EventDef : 每个事件一个记录项。包含标志和名称。

      ModuleDef  {1}----------->{*} TypeDef {1}-----------------> | {*} MethodDef {1} ----------------->{*} ParamDef

                                      | {*} FieldDef

                                      | {*} PropertyDef

                                      | {*} EventDef

  常用引用源数据表

    AssemblyRef : 引用的每一个程序集有一个记录项。包含绑定该程序集所需的信息:程序集名称、版本号、语言文化以及公钥Token(根据发布者的公钥生成的一个小的哈希值,标识了所引用程序集的发布者)。另外还包含了一些标志以及一个被CLR忽略的但可以用于程序集的二进制数据的校验和的哈希值。

    ModuleRef : 引用类型的实现的每个PE模块有一个记录项。包含模块名和扩展名。

    TypeRef : 每个引用的类型有一个记录项。包含类型的名称和引用(指向类型的位置)。如果类型在另一个类型中实现,引用指向一个TypeRef记录项。如果类型在同一模块中实现,引用指向一个ModuleDef记录项。如果类型在调用程序集内的另一个模块中实现,引用指向一个ModuleRef记录项。如果类型在不同的程序集中实现,引用指向一个Assembly记录项;

    MemberRef : 引用的每个成员(字段、方法、属性方法和事件方法)有一个记录项。包含成员的名称和签名,并指向对成员进行定义的类型的TypeRef记录项。

      

      MemberRef------------->TypeRef-----------------> | TypeRef        (在另一个类型中实现)        ======>ModuleDef 或 ModuleRef 或 Assembly

                                  | ModuleDef  (在同一模块)

                                  | ModuleRef    (在同程序集的不同模块)

                                  | Assembly     (在不同程序集)

  除此之外还有很多定义表和引用表。

  清单表中主要包含作为程序集组成部分的那些文件的名称。此外,还描述了程序集的版本、语言文化、发布者、公开导出的类型以及构成程序集的所有文件。

  CLR总是首先加载包含“清单”元数据表的文件,再根据“清单”来获取程序集中的其他文件。清单包含在PE文件中。

  清单元数据表(程序集的):

    AssemblyDef : 如果模块标识的是程序集,就包含单一记录项来列出程序集名称、版本、语言文化、一些标志、哈希算法以及发布者公钥(可为null);

    FileDef : 每个PE文件和资源文件都有一个记录项(清单本身所在文件除外,该文件在AssemblyDef的单一记录项中列出)。包含文件名、扩展名、哈希值和一些标志。如果程序集只包含自己的文件,则该表无记录(VS中不能创建多文件程序集,只能通过命令行);

    ManifestResourceDef : 每个资源文件一个记录项。包含资源名称、一些标志(是否外部可见:public,private)以及FileDef表的一个索引(指出包含在哪个文件中)。如果资源不是独立文件,那么资源是包含在PE文件中的流。嵌入资源,记录项会包含一个偏移量,指出资源流在PE文件中的起始位置;

    ExportedTypesDef : PE模块中导出的每个public类型有一个记录项。包含类型名称、FileDef表的一个索引(指出类型由程序集的哪个文件实现)以及TypeDef表的一个索引。

      AssemblyDef {1}-------------------->{*} FileDef {1}<----------------------------->{1} ManifestResourceDef

      ExportedTypesDef {0,1}------------>{1} FileDef + {1} TypeDef

      

  

clr 元数据的更多相关文章

  1. 【CLR via C#】CSC将源代码编译成托管模块

    下图展示了编译源代码文件的过程.如图所示,可用支持 CLR 的任何一种语言创建源代码文件.然后,用一个对应的编译器检查语法和分析源代码.无论选用哪一个编译器,结果都是一个托管模块(managedmod ...

  2. 认识元数据和IL(中)<第四篇>

    书接上回[第二十四回:认识元数据和IL(上)],我们对PE文件.程序集.托管模块,这些概念与元数据.IL的关系进行了必要的铺垫,同时顺便熟悉了以ILDASM工具进行反编译的基本方法认知,下面是时候来了 ...

  3. [你必须知道的.NET]第二十五回:认识元数据和IL(中)

    发布日期:2009.02.25 作者:Anytao © 2009 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. 说在,开篇之前 书接上回[第二十四回:认识元数据和IL(上)], ...

  4. 【深入理解CLR】1:CLR的执行模型

    将源代码编译成托管模块 下图展示了编译源代码文件的过程.如图所示,可用支持 CLR 的任何一种语言创建源代码文件.然后,用一个对应的编译器检查语法和分析源代码.无论选用哪一个编译器,结果都是一个托管模 ...

  5. .NET 编译器(”Roslyn“)介绍

    介绍 一般来说,编译器是一个黑箱,源代码从一端进入,然后箱子中发生一些奇妙的变化,最后从另一端出来目标文件或程序集.编译器施展它们的魔法,它们必须对所处理的代码进行深入的理解,不过相关知识不是每个人都 ...

  6. [搬运] DotNetAnywhere:可供选择的 .NET 运行时

    原文 : DotNetAnywhere: An Alternative .NET Runtime 作者 : Matt Warren 译者 : 张很水 我最近在收听一个名为DotNetRock 的优质播 ...

  7. .NET本质论 方法

    方法和JIT编译 CLR只执行本机的机器代码.如果一个方法体由CIL组成,那么它就必须在调用之前被转换为本机的机器码(将MSIL编译为本机代码,运行库提供了两种方式.一种就是在安装与部署时的预编译(由 ...

  8. .NET本质论 用类型编程

    运行时的类型 类型本身并不是万能的.类型真正有意思的地方在于,程序员使用类型的实例,并让它们相互作用.类型的实例(instance)既可以是对象,也可以是值,这取决于类型如何定义的.基本数据类型(pr ...

  9. .NET本质论 组件

    模块定义 CLR程序存在模块(module)中.一个CLR模块是一个字节流,通常作为一个文件存储在本地的文件系统中或者Web服务器上 CLR模块采用Windows NT的PE/COFF可执行文件格式的 ...

随机推荐

  1. SQL Server 大数据搬迁之文件组备份还原实战

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搬迁步骤(Procedure) 搬迁脚本(SQL Codes) ...

  2. 菜鸟学Struts2——Actions

    在对Struts2的工作原理学习之后,对Struts2的Action进行学习.主要对Struts2文档Guides中的Action分支进行学习,如下图: 1.Model Driven(模型驱动) St ...

  3. PHP-解析验证码类--学习笔记

    1.开始 在 网上看到使用PHP写的ValidateCode生成验证码码类,感觉不错,特拿来分析学习一下. 2.类图 3.验证码类部分代码 3.1  定义变量 //随机因子 private $char ...

  4. Expression Blend创建自定义按钮

    在 Expression Blend 中,我们可以在美工板上绘制形状.路径和控件,然后修改其外观和行为,从而直观地设计应用程序.Button按钮也是Expression Blend最常用的控件之一,在 ...

  5. VB.NET设置控件和窗体的显示级别

    前言:在用VB.NET开发射频检测系统ADS时,当激活已存在的目标MDI子窗体时,被其他子窗体遮住了,导致目标MDI子窗体不能显示. 这个问题怎么解决呢?网上看到一篇帖子VB.NET设置控件和窗体的显 ...

  6. C#关于分页显示

    ---<PS:本人菜鸟,大手子还请高台贵手> 以下是我今天在做分页时所遇到的一个分页显示问题,使用拼写SQL的方式写的,同类型可参考哦~ ------------------------- ...

  7. input type='file'上传控件假样式

    采用bootstrap框架样式 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> &l ...

  8. Springboot搭建web项目

    最近因为项目需要接触了springboot,然后被其快速零配置的特点惊呆了.关于springboot相关的介绍我就不赘述了,大家自行百度google. 一.pom配置 首先,建立一个maven项目,修 ...

  9. GOF23设计模式归类

    创建型模式:-单例模式.工厂模式.抽象工厂模式.建造者模式.原型模式结构型模式:-适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式行为型模式:-模板方法模式.命令模式.迭代器模式 ...

  10. CSS常见技巧

    一.CSS Sprite(雪碧图|精灵图)指什么? 有什么作用? CSS雪碧 即CSS Sprite,也有人叫它CSS精灵,是一种CSS图像合并技术,该方法是将小图像和背景图片合并到一张图片上,然后利 ...