先将下面的代码保存到文本中,存放到一个目录下面,E:\aa.txt

public sealed class Program{
    public static void Main(){
        System.Console.WriteLine("Hi");
        System.Console.Read();
    }
}

  编译上面的文本文件:

       

  Program.exe是一个托管PE文件,由4个部分构成:PE32(+)头、CLR头、元数据以及IL。运行Program.exe时,CLR会加载并初始化它。然后,CLR读取程序集的CLR头,查找标识了应用程序入口的方法(Main)的MethodDefToken。然后,CLR会检索MethodDef元数据表,找到该方法的IL代码在文件中的偏移量,把这些IL代码JIT编译成本地代码。编译时会对代码进行验证以确保类型安全性。最后,将执行本地代码。

  下面展示了Main方法的IL代码。为了获取这个输出,请运行ILDasm.exe,选择“视图”|“显示字节”,然后双击树形视图中的Main方法。

  对这个代码进行JIT编译时,CLR会检查对类型和成员的所有引用,并加载定义了它们的程序集。可以看出,上述IL代码有一个对System.Console.WriteLine的引用。具体地说,IL call指令引用了元数据token 0A000003。这个token对应于MemberRef元数据表(表0A)中的记录项3。CLR检查这个MemberRef记录项,发现它的一个字段引用了一个TypeRef表中的一个记录项(System.Console类型)。根据TypeRef记录项,CLR被引导至一个AssemblyRef记录项:“mscorlib, version=4.0.0.0, culture=neutral, PublicKeyToken=b77a5c561934e089”。这样,CLR就知道了它需要的是哪一个程序集。接着,CLR必须定位并加载该程序集。

"运行时"如何解析类型引用的更多相关文章

  1. 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_运行时解析类型引用

    public sealed class Program{ public static void Main() { System.Console.WriteLine("Hi"); } ...

  2. C# 在运行时动态创建类型

    C# 在运行时动态的创建类型,这里是通过动态生成C#源代码,然后通过编译器编译成程序集的方式实现动态创建类型 public static Assembly NewAssembly() { //创建编译 ...

  3. Jvm运行时内存解析

    一.jvm的概念 在了解jvm的概念之前,我们先来了解java平台的逻辑结构,图片来自<深入java虚拟机> 从图中我们可以看到jdk包含了jre,java语言和java开发工具和Api, ...

  4. MFC原理第三讲.RTTI运行时类型识别

    MFC原理第三讲.RTTI运行时类型识别 一丶什么是RTTI RTTI. 运行时的时候类型的识别. 运行时类型信息程序.能够使用基类(父类)指针 或者引用 来检查这些指针或者引用所指的对象. 实际派生 ...

  5. 《精通C#》第十六章-动态类型和动态语言运行时-第一节至第四节

    在.Net4.0中引入了一个关键字dynamic,这是一个动态类型关键字.Net中还有一个关键字是var,这是一个隐式类型,可以定义本地变量,此时var所代表的实际的数据类型有编译器在初次分配时决定, ...

  6. Java虚拟机运行时栈帧结构--《深入理解Java虚拟机》学习笔记及个人理解(二)

    Java虚拟机运行时栈帧结构(周志明书上P237页) 栈帧是什么? 栈帧是一种数据结构,用于虚拟机进行方法的调用和执行. 栈帧是虚拟机栈的栈元素,也就是入栈和出栈的一个单元. 2018.1.2更新(在 ...

  7. Java运行时环境---内存划分

    背景:听说Java运行时环境的内存划分是挺进BAT的必经之路. 内存划分: Java程序内存的划分是交由JVM执行的,而不像C语言那样需要程序员自己买单(C语言需要程序员为每一个new操作去配对del ...

  8. JVM运行时数据区域

    上面已经聊过JVM是什么东东,也谈过了JVM内存的垃圾回收机制.这一篇博客我们来聊聊JVM运行时数据区域. JVM运行时数据区域由5块部分组成,分别是堆,方法区,栈,本地方法栈,以及程序计数器组成. ...

  9. Java内存管理:Java内存区域 JVM运行时数据区

    转自:https://blog.csdn.net/tjiyu/article/details/53915869 下面我们详细了解Java内存区域:先说明JVM规范定义的JVM运行时分配的数据区有哪些, ...

随机推荐

  1. kuangbin_UnionFind A (POJ 2236)

    挺接近模板的一题 接受O操作的时候扫一遍 符合条件的merge进去 done #include <cstdio> #include <cstring> #include < ...

  2. 如何读懂 Intel HEX 文件

    什么是 Intel HEX 文件格式   转自:http://www.cnblogs.com/imapla/archive/2013/03/16/2926133.htmlIntel HEX 文件是遵循 ...

  3. 黑马程序员——JAVA基础之泛型和通配符

    ------- android培训.java培训.期待与您交流! ---------- 泛型:            JDK1.5版本以后出现新特性.用于解决安全问题,是一个类型安全机制. 泛型好处: ...

  4. vb6动态创建webbrowser

    Option Explicit Private WithEvents IE As VBControlExtender Private Sub Command1_Click() Dim IE Set I ...

  5. IPy

    IPy生成网段列表from IPy import IPip = IP('192.168.0.0/16')print ip.len()for x in ip:print (x) ip的属性,'PUBLI ...

  6. ABBYY FineReader 12最新官方版下载

    ABBYY FineReader是市场领先的文字识别(OCR)软件,可快速方便地将扫描纸质文档.PDF文件和数码相机的图像转换成可编辑.可搜索的信息,ABBYY FineReader 12是目前最新版 ...

  7. unity, eulerAngle

    unity中欧拉角规定如下: A rotation that rotates euler.z degrees around the z axis, euler.x degrees around the ...

  8. python exec

    exec官方声明This statement supports dynamic execution of Python code. exec语句用来执行储存在字符串或文件中的python语句.exec ...

  9. Oracle中的不等于号

    今天碰到一个Oracle不等于的问题,最后搜索了一下,发现下面资料,拿来跟大家分享一下   关于Oracle中的不等于号: 在Oracle中, <> != ~= ^= 都是不等于号的意思. ...

  10. Readonly和Disabled的区别

    readonly 把输入的字段设为只读,但是没有禁用 readonly=” readonly”; disabled 禁用一个input元素. disabled="disabled" ...