读懂IL代码(三)
由于要写毕业论文的缘故,最近比较没有时间写,总是要抽出时间抽出时间。诶,这样的生活比较烦躁。
这一篇主要写委托、类、方法的IL代码,一一来说明。
委托:搞过C#的都应该清楚,委托实际上是一个类。编译器会把它编译成一个类,继承自MulticastDelegate的类,里面有三个方法,BeginInvoke,EndInvoke和Invoke,当我们使用委托方法名进行调用方法时,编译器内部实际上是调用了Invoke方法(语法糖)。
以下就用简单的代码来掩饰一下委托的IL代码

先来看看编译器把委托编译成什么样子:

好啦,下面就是重要的IL代码啦,其实大家可以先自己去尝试解析一下,我觉得当自己去尝试某些东西的话,会记得更牢一些。

看到上面的代码,是否有的指令非常熟悉,我觉得大部分的指令我们在前面两篇都有讲过了,不过在这里我还是一句一句的解释
.method private hidebysig static void Main(string[] args)cilmanaged
{
.entrypoint //入口啦,这个说过很多次了。
.maxstack 2 //评估堆栈可能容纳数据项的最大个数。
.locals init (
[] class TestDemo4.Program/MyDele dele) //上面已经讲过了,委托最终是编译成类的,所以这里是一个类类型的变量dele,存储在调用栈。
L_0000: nop //No Operation。
L_0001: ldnull //将空引用推送到计算堆栈上。
L_0002: ldftn void TestDemo4.Program/UserInfo::PrintName(string) //将指向实现特定方法的本机代码的非托管指针(native int类型)推送到计算堆栈上,也就是指将方法指针压入评估栈中。
L_0008: newobj instance void TestDemo4.Program/MyDele::.ctor(object, native int)//创建委托实例并压入评估栈中。这一步会调用委托的构造函数(.ctor),这个构造函数需要两个参数,一个是对象引用,这里就是L_0001:ldnull:空对象,第二个参数是方法的地址L_0002中的动作。
L_000d: stloc.0 //将评估栈中的委托实例保存到调用栈的第0个位置上。
L_000e: ldloc.0 //获取调用栈中第0位置的值(委托实例),并压入评估栈中。
L_000f: ldstr "Helius" //加载字符串,在托管堆中创建Helius对象,并把引用存放在评估栈上。
L_0014: callvirt instance void TestDemo4.Program/MyDele::Invoke(string) //Invoke,看到没,委托实例调用了Invoke的的方法来执行。callvirt只能调用实例方法和虚方法,不能调用静态方法
L_0019: nop //No Operation
L_001a: call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey() //调用ReadKey方法。
L_001f: pop //清空评估栈。
L_0020: ret //return。
}
--------------------------------------------------------------------------------分割线------------------------------------------------------------------------------------------------
类与方法的常规代码:

这里先从Person类开始解析,这里我使用到了自动属性,大家应该也都很明了,编译器把自动属性编译成了一个私有字段和两个方法。

OK啦,又到了看Main函数的IL代码时间了

上面的IL代码中,只有一个指令在之前没有出现过,那就是newobj这个指令,这个指令的意思是创建一个实例对象,并将实例对象的引用推送到计算堆栈上,也就是评估栈上。
我不想一句一句的解析了,我现在就用画图的形式来解释一下实例化一个类的过程:

其实我这里也只是泛泛之谈而已,我觉得大家完全有必要自己写一个小Demo,编译完之后使用Reflector看一下IL代码,这样子会更清晰一些。而且有不懂的地方,我觉得大家完全可以自行百度或者拿出来让大家讨论一下。
下一章再讲一下流程控制的IL代码后,我想应该就可以结束掉这部分内容了。
读懂IL代码(三)的更多相关文章
- 读懂IL代码就这么简单(三)完结篇
一 前言 写了两篇关于IL指令相关的文章,分别把值类型与引用类型在 堆与栈上的操作区别详细的写了一遍 这第三篇也是最后一篇,之所以到第三篇就结束了,是因为以我现在的层次,能理解到的都写完了,而且个人认 ...
- 【转载】读懂IL代码就这么简单(三)完结篇
一 前言 写了两篇关于IL指令相关的文章,分别把值类型与引用类型在 堆与栈上的操作区别详细的写了一遍这第三篇也是最后一篇,之所以到第三篇就结束了,是因为以我现在的层次,能理解到的都写完了,而且个人认为 ...
- 读懂IL代码就这么简单(二)
一 前言 IL系列 第一篇写完后 得到高人指点,及时更正了文章中的错误,也使得我写这篇文章时更加谨慎,自己在了解相关知识点时,也更为细致.个人觉得既然做为文章写出来,就一定要保证比较高的质量,和正确率 ...
- 读懂IL代码就这么简单 (一)
一前言 感谢 @冰麟轻武 指出文章的错误之处,现已更正 对于IL代码没了解之前总感觉很神奇,初一看完全不知所云,只听高手们说,了解IL代码你能更加清楚的知道你的代码是如何运行相互调用的,此言一出不明觉 ...
- 读懂IL代码就这么简单
原文地址:http://www.cnblogs.com/zery/p/3366175.html 一前言 感谢 @冰麟轻武 指出文章的错误之处,现已更正 对于IL代码没了解之前总感觉很神奇,初一看完全不 ...
- 读懂IL代码就这么简单 ---- IL系列文章
读懂IL代码就这么简单 (一) 读懂IL代码就这么简单(二) 读懂IL代码就这么简单(三)完结篇 出处:http://www.cnblogs.com/zery/tag/IL%20%E7%B3%BB%E ...
- 【转载】读懂IL代码就这么简单(二)
一 前言 IL系列 第一篇写完后 得到高人指点,及时更正了文章中的错误,也使得我写这篇文章时更加谨慎,自己在了解相关知识点时,也更为细致.个人觉得既然做为文章写出来,就一定要保证比较高的质量,和正确率 ...
- 【转载】读懂IL代码就这么简单 (一)
一前言 感谢 @冰麟轻武 指出文章的错误之处,现已更正 对于IL代码没了解之前总感觉很神奇,初一看完全不知所云,只听高手们说,了解IL代码你能更加清楚的知道你的代码是如何运行相互调用的,此言一出不明觉 ...
- 读懂IL代码(四)
这一篇是IL系列的最后一篇的,主要是要说一下IL中的流程控制.我相信,经过前面三篇的介绍,看IL代码应该不是什么大问题了吧.好吧,闲话不多说了,就来简单的说一下吧. 还是跟前几篇一样,以例子来解释说明 ...
随机推荐
- [转]NHibernate之旅(9):探索父子关系(一对多关系)
本节内容 引入 NHibernate中的集合类型 建立父子关系 父子关联映射 结语 引入 通过前几篇文章的介绍,基本上了解了NHibernate,但是在NHibernate中映射关系是NHiberna ...
- 树的最大深度 leecode java
秒杀/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode ...
- 转载:Python中的new style class机制实现
1.Python中的对象模型python中所有东西都是对象 class对象:表示Python内置的类型和定义的类型instance对象(实例对象):表示由class对象创建的实例 1.1 对象间的关系 ...
- 为什么JavaScript开发如此疯狂
本文由码农网 – 小峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! Web开发太有意思了! 但是JavaScript则……令人望而生畏. Web开发中其他一切对你而言都是小菜一碟, ...
- 关于升级linux下apache
1:Check whether Apache is already installed. # rpm -qa | grep -i http httpd-tools-2.2.8-3.i386 httpd ...
- hibernate.Session简介
★→→SessionFactory (org.hibernate.SessionFactory) 包含已经编译的映射(mappings),是制造session的工厂,可能含有一些可以在各个事务(tra ...
- MongoDB 复制集(二) 选举 自动故障切换
一 复制集的高可用性简介 复制集通过故障自动切换来实现高可用性,当主节点出现故障的时候,从节点可以通过选举成为主节点,而这个过程在大多数当情况下是自动进行的,不需要手动干预.在某些情况 ...
- 用LINQPad加上Tx驱动来分析log
Tx (LINQ to Logs and Traces)是微软发布的开源工具.可以用这个工具来使用LINQ分析日志,包括 Event Tracing for Windows (ETW) Event L ...
- .Net训练营优惠有条件 做到立减800元大钞
.NET 是 Microsoft XML Web services 平台.XML Web services 允许应用程序通过 Internet 进行通讯和共享数据,而不管所采用的是哪种操作系统.设备或 ...
- DataTable导入到Excel文件
; saveFileDialog.RestoreDirectory = ; , intIndex] = column.ColumnName; ...