《你必须知道的.NET》读书笔记:方法表初窥
一、窥探准备工作
public class Base
{
public void M()
{
Console.WriteLine("M in Base");
} public virtual void N()
{
Console.WriteLine("N in Base");
}
} public class Three : Base
{
private static int ID
{
get;
set;
} public override void N()
{
// Something new in class Three
Console.WriteLine("N in Three");
} public void M()
{
Console.WriteLine("M in Three"); M1();
} public void M1()
{
Console.WriteLine("M1 in Three");
}
} public class Program
{
public static void Main(string[] args)
{
Base three = new Three();
three.M();
three.N(); Console.ReadKey();
}
}
调试运行,执行结果如下图所示:

二、窥探方法表执行过程
2.1 方法表的创建
执行Main方法调用时,Three实例的创建与相应类型的加载也随之发生。然而,类型加载是在实例创建之前完成的,也就是我们常常说到的方法表创建。当程序执行到three.N()处时,Three类型的方法表如下图所示:

2.2 总体执行过程
(1)class loader 从元数据表加载相关元数据信息,根据信息创建方法表(这里主要是指CORINFO_CLASS_STRUCT结构)

(2)加载后,方法表槽都保存了应该执行的行为逻辑,这些信息保存在方法描述(Method Desc)结构中,MethodDesc被初始化为指向IL代码,同时还包含一个指向触发JIT编译的PreJitStub地址

2.3 具体执行过程
这里以N()方法来看看其具体的执行过程:
(1)任何方法第一次执行时都会首先触发执行JIT编译,JIT编译的主要工作就是将IL代码翻译为本地代码,并插入指向本地代码的jmp指令地址覆盖原来的Call JIT Complier指令

(2)当该方法再次被执行,因为方法描述(MethodDesc结构)中保存了机器码地址,以后的执行将不会执行JIT编译过程而直接执行机器码,实现整个执行过程。
三、小结

Metadata描述了静态的结构,而IL阐述了动态的执行,一静一动承载着很多的技术奥秘。
《你必须知道的.NET》读书笔记:方法表初窥的更多相关文章
- 你必须知道的.net读书笔记之第二回深入浅出关键字---对抽象编程:接口和抽象类
请记住,面向对象思想的一个最重要的原则就是:面向接口编程. 借助接口和抽象类,23个设计模式中的很多思想被巧妙的实现了,我认为其精髓简单说来就是:面向抽象编程. 抽象类应主要用于关系密切的对象,而接口 ...
- 你必须知道的.net读书笔记第四回:后来居上:class和struct
基本概念 1.1. 什么是class? class(类)是面向对象编程的基本概念,是一种自定义数据结构类型,通常包含字段.属性.方法.属性.构造函数.索引器.操作符等.因为是基本的概念,所以不必在此 ...
- 必须知道的.net——学习笔记1
1.对象的生成(出生) Person aperson=new Person("小张",25) 构造过程:分配存储空间—初始化附加成员—调用构造函数 2.对象的旅程(在一定的约定与规 ...
- C#刨根究底:《你必须知道的.NET》读书笔记系列
一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...
- 《你必须知道的.NET》读书笔记一:小OO有大智慧
此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.对象 (1)出生:系统首先会在内存中分配一定的存储空间,然后初始化其附加成员,调用构造函数执行初 ...
- 《你必须知道的.NET》读书笔记二:小OO有大原则
此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.单一职责原则 (1)核心思想:一个类最好只做一件事,只有一个引起它变化的原因 (2)常用模式:Fa ...
- 《你必须知道的.NET》读书笔记三:体验OO之美
此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.依赖也是哲学 (1)本质诠释:“不要调用我们,我们会调用你” (2)依赖和耦合: ①无依赖,无耦合 ...
- 《你必须知道的.NET》读书笔记:从Hello World认识IL
通用的语言基础是.NET运行的基础,当我们对程序运行的结果有异议的时候,如何透过本质看表面,需要我们从底层来入手探索,这时候,IL便是我们必须知道的基础. 一.IL基础概念 1.1 什么是IL? IL ...
- 《你必须知道的.NET》读书实践:一个基于OO的万能加载器的实现
此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.关于万能加载器 简而言之,就是孝顺的小王想开发一个万能程序,可以一键式打开常见的计算机资料,例如: ...
随机推荐
- intel显卡笔记本恢复屏幕亮度调整功能
更新Intel显卡驱动后不能修改屏幕亮度,可以在注册表里面搜索featuretestcontrol,将f000修改为ffff,重启后就可以通过Fn+F4/F5调整屏幕亮度了. 注:此方法适用于带有in ...
- Thrift 2中get用法的详细解析
Thrift2相比于Thrift 1改动较大,这里不去描述改动的地方,但是它的改动确实比Thrift1方便了很多.但是不能理解的是Thrift2网上的资料和文档相当的少,就以Thrift2操作Hbas ...
- mysql中left join ,right join 以及inner join 比较
下面是例子分析表A记录如下: aID aNum 1 a20050111 2 a20050112 3 a20050113 4 ...
- [linux] 结构化命令-for
1 for命令 # for:迭代循环:默认空格为分隔符 for var in list do commands done 1.1 读取列表中的值 #!usr/bin/bash for test in ...
- javascript语言精粹摘要
JavaScript中五种基本类型:string,number,boolean,null,undefined.还有一个对象类型object. javascript只有一个数字类型.它在内部被表示为64 ...
- OpenVPN 通过服务器上网
在Windows环境中架设OpenVPN服务相对比较简单,网上这方面的教程也比较丰富,照葫芦画瓢即可.但是大部分教程都只讲了如何将client与Server通过VPN管道连接起来,使client可以正 ...
- HttpWebResponse远程服务器返回错误: (500) 内部服务器错误。
现象 我们编码实现请求一个页面时,请求的代码类似如下代码: HttpWebRequest req = (HttpWebRequest)WebRequest.Create(strUrl); req.Us ...
- Highchart使用json格式数据lineDemo
<html> <head> <title>Highcharts Example</title> <script type="text/j ...
- bx、si、di 和 bp
bx.si.di 和 bp 在 8086CPU 中,只有这 4 个寄存器可以用在 "[...]" 中来进行内存单元的寻址. mov ax, [bx] mov ax, [bx+si] ...
- Cauchy 级数浓缩判别法