读懂IL代码(一)
以前刚开始学C#的时候,总有高手跟我说,去了解一下IL代码吧,看懂了你能更加清楚的知道你写出来的代码是如何运行互相调用的,可是那时候没去看,后来补的,其实感觉也不晚。刚开始看IL代码的时候,感觉非常吃力,一大堆不懂,后来,慢慢看,最后也能看得懂一丁点啦。
闲话不多说了,下面就开始讲讲IL代码
1、什么是IL代码
IL,也称为CIL,MSIL,是.NET框架中中间语言(Intermediate Language)的缩写。上一篇文章已经说过了,Visual Studio继承的C#编译器可以直接把C#写的源程序编译成.exe或.dll格式的文件,这些文件里面保存的就是IL代码,这些代码CPU是认不得的,只能再经过JIT编译后,CPU才会执行。
2、How to Study IL
IL的代码形式比较特殊,看起来会比较吃力,理解全部肯定更困难。但在这个世上有一个定律叫做“二八原则”,20%的人掌握着世上80%的财富。这在编程上也是一样的,80%的功能其实只需要用20%的技术就可以完成了,但另外的20%,就有可能需要80%的技术了。学习IL代码也是一样,它有200多个指令(可以查看这里:IL指令),我们只要学习常用的20%就可以解决80%的问题了。不管怎么说,就是要多看,看多了自然就会懂了。
3、怎么查看源代码
(1)先写正常程序,通过编译
(2)找Bin文件夹中找到exe后缀的文件
(3)拖入Reflector(我习惯用这个来看反编译代码),也可以使用别的反编译软件,比如ILDasm,ILSpy等。初学者我是建议使用ILDasm,因为这是微软自带的。
我在网上找了两张图,是使用ILDasm的,大家可以参考借鉴一下。
上面两张图是用ILDasm的。而我还是习惯用Reflector。
上图的右边就是传说中的IL代码了,看起来复杂吗?应该不复杂吧,来,再多看几眼......下面我就一句一句来解释。
//Call Stack是调用栈,一个局部变量列表,用于存储.locals init([0] int32 num,[1] int32 num2,[2] int32 num3)初始化变量。
//Evaluation Stack也是一个评估栈,用来存储值,比如ldc.i4.1这种指令会把1压入栈中等待操作。
//栈是一种先进后出的数据结构。
//hidebysig指令表示如果当前类为父类,用该指令标记的方法将不会被子类继承 |
以上的IL代码算是比较简单的一段代码,因为没有条件判断等流程控制。但只要记住每一条IL指令固定的操作,我觉得也不难。接下来会写第二部分,主要写引用类型的IL代码,更深入理解IL代码。
最新文章
- hihoCoder 1185 连通性·三(Tarjan缩点+暴力DFS)
- npoi上传xlsx文件,并读取数据
- java中static{}语句块详解
- 四、Handler(WSGIHandler)
- Windows下PHPUnit安装
- TP学习笔记
- Apache Thrift学习之一(入门及Java实例演示)
- (转)android ListView详解
- Codeforces 161 D. Distance in Tree (树dp)
- Hyper-V 虚拟机连接外部网络
- [WinForm]DataGridView列自适应
- php while循环 指定显示内容 例如不想显示前10条和后10条
- linux $ 类型变量 及Makefile 中 $ 类型变量的含义
- 如何在jenkins上新建一个项目及其简单配置
- Struts(十三):通用标签
- 乱码问题-页面跳转方式-Servlet配置文件
- service注入到action中
- idea 2018.1破解激活方法,有效期至2099年 idea 激活 破解
- spring mvc 解决跨域问题
- Wannafly挑战赛25C 期望操作数
热门文章
- group by 替代distinct
- mysql中的timestamp类型时间比较:unix_timestamp函数
- ServiceStack.Redis 之 IRedisTypedClient
- 【转】Android ROM研究---Android build system增加模块
- 【转】关于 Endnote 与 Word 卡死问题 标记语法错误
- OpenStack Havana 部署在Ubuntu 12.04 Server 【OVS+GRE】(一)——控制节点的安装
- OpenOffice 服务开机启动
- zoj 2734 Exchange Cards【dfs+剪枝】
- IE的Cookie目录和临时缓存目录的关系
- codeforces 710C