一、窥探准备工作

    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阐述了动态的执行,一静一动承载着很多的技术奥秘。

作者:周旭龙

出处:http://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

《你必须知道的.NET》读书笔记:方法表初窥的更多相关文章

  1. 你必须知道的.net读书笔记之第二回深入浅出关键字---对抽象编程:接口和抽象类

    请记住,面向对象思想的一个最重要的原则就是:面向接口编程. 借助接口和抽象类,23个设计模式中的很多思想被巧妙的实现了,我认为其精髓简单说来就是:面向抽象编程. 抽象类应主要用于关系密切的对象,而接口 ...

  2. 你必须知道的.net读书笔记第四回:后来居上:class和struct

     基本概念 1.1. 什么是class? class(类)是面向对象编程的基本概念,是一种自定义数据结构类型,通常包含字段.属性.方法.属性.构造函数.索引器.操作符等.因为是基本的概念,所以不必在此 ...

  3. 必须知道的.net——学习笔记1

    1.对象的生成(出生) Person aperson=new Person("小张",25) 构造过程:分配存储空间—初始化附加成员—调用构造函数 2.对象的旅程(在一定的约定与规 ...

  4. C#刨根究底:《你必须知道的.NET》读书笔记系列

    一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...

  5. 《你必须知道的.NET》读书笔记一:小OO有大智慧

    此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.对象  (1)出生:系统首先会在内存中分配一定的存储空间,然后初始化其附加成员,调用构造函数执行初 ...

  6. 《你必须知道的.NET》读书笔记二:小OO有大原则

    此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.单一职责原则 (1)核心思想:一个类最好只做一件事,只有一个引起它变化的原因 (2)常用模式:Fa ...

  7. 《你必须知道的.NET》读书笔记三:体验OO之美

    此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.依赖也是哲学 (1)本质诠释:“不要调用我们,我们会调用你” (2)依赖和耦合: ①无依赖,无耦合 ...

  8. 《你必须知道的.NET》读书笔记:从Hello World认识IL

    通用的语言基础是.NET运行的基础,当我们对程序运行的结果有异议的时候,如何透过本质看表面,需要我们从底层来入手探索,这时候,IL便是我们必须知道的基础. 一.IL基础概念 1.1 什么是IL? IL ...

  9. 《你必须知道的.NET》读书实践:一个基于OO的万能加载器的实现

    此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.关于万能加载器 简而言之,就是孝顺的小王想开发一个万能程序,可以一键式打开常见的计算机资料,例如: ...

随机推荐

  1. Archlinux 上 Nginx + PHP + Mariadb + DiscuzX2.5 安装小记

    因为不好找下载集成服务器工具,而且他们自己又打包了一份 php 之类的程序,本身系统就已经有 php 还有数据库什么的了再搞一份受不了,最后选择了手动配置…… 这是一个在 Archlinux 上手动从 ...

  2. Matlab(2) -- Find()函数

    转自:http://www.matlabsky.com/thread-4228-1-1.html find函数:用于查询非零元素的行和列标志 语法: ind = find(X) ind = find( ...

  3. ListView显示不同行以及数据重用

    Handling ListViews with Multiple Row Types When you start writing Android Apps it isn’t long before ...

  4. Win7 64位 VS2013环境使用cuda_7.5.18

    首先得吐槽下VS2015出来快一年了CUDA居然还不支持,没办法重装系统刚从2013升到2015,还得再装回一个2013用,只为学习CUDA... 然后安装的时候,如果你选择自定义组件安装,注意不要改 ...

  5. CentOS 访问Windows7共享文件夹

    在终端中输入命令mount -t cifs -o username="xxx",password="****" //192.168.1.1/share_fold ...

  6. 字符串流stringstream(头文件sstream)

    今天看到一样很有趣的东西,可以用于各种类型的转换.其实一个文本可以看作一个长长的字符串,整数啊浮点数的都是字符串,于是在字符串流里面就可以很方便地玩转各种类型,比如说: #include<ios ...

  7. response.sendRedirect的细节

    今天敲书上的例子的时候无意间发现,response中的sendRedirect()重定向到另一个servlet时,调用的是doget方法,不明所以,百度得知,原来还牵扯到http协议的细节问题,原文如 ...

  8. 转行IT行业的心路历程3

    16年丝袜生意很差的一年,老板的态度也不好,大唐本地人太歧视外地人了.而且我干的不开心没有前途,不能体现自我价值,无论你怎么努力. IT技术行业却不是这样,只要你努力肯学习,一定会有回报的. 在16/ ...

  9. VS2013安装部署项目

    打开vs2013/2015菜单扩展和更新,查找Installer,找到Microsoft Visual Studio 2015 Installer Projects并下载安装. 安装之后模板中即有“安 ...

  10. 个人网页的留言板实现与sae的数据库账户配置

    个人网页(github)的留言板终于搞定了.总之后端的东西不会写,只有修改以前教程里面的文件.记录一下重要的过程. 使用了留言保存的send()函数,模版有注册登录功能.根据需求修改了一下,去掉了登录 ...