IT知识库 购物 网址 游戏 小说 歌词 快照 开发 股票 美女 新闻 笑话 | 汉字 软件 日历 阅读 下载 图书馆 编程 China
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程 CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
站长资讯 .NET新手 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA VisualStudio ASP.NET-MVC .NET控件开发 EntityFramework WinRT-Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动 Html-Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP OracleERP DynamicsCRM K2 BPM 信息安全 企业信息 Android开发 iOS开发 WindowsPhone WindowsMobile 其他手机 敏捷开发 项目管理 软件工程 SQLServer Oracle MySQL NoSQL 其它数据库 Windows7 WindowsServer Linux
  IT知识库 -> C# -> 读懂IL代码(三) -> 正文阅读

[C#]读懂IL代码(三)

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

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

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

看到上面的代码,是否有的指令非常熟悉,我觉得大部分的指令我们在前面两篇都有讲过了,不过在这里我还是一句一句的解释

.method private hidebysig static void Main(string[] args)cilmanaged
{
    .entrypoint //入口啦,这个说过很多次了。
    .maxstack 2 //评估堆栈可能容纳数据项的最大个数。
    .locals init (
        [0] 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代码后,我想应该就可以结束掉这部分内容了。
上一篇文章      下一篇文章      查看所有文章
加:2016-03-21 23:34:17  更:2017-05-14 18:34:15 
 
  C# 最新文章
字符串阵列分别输出元素的索引,原值和长度
格式化你的字符串
C#宣告一个变量
C#中级
拆分一个字符串并把每个字符单独输出
通过手机号定位归属地
【重构学习】02 何处重构?
C#把数组中的某个元素取出来放到第一个位置
c#加密 可逆与不可逆MD5 加密
实现一个双缓冲队列(二)
技术频道: 站长资讯 .NET新手区 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA Visual Studio ASP.NET MVC .NET控件开发 Entity Framework WinRT/Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动设计 Html/Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP Oracle ERP Dynamics CRM K2 BPM 信息安全 企业信息化其他 Android开发 iOS开发 Windows Phone Windows Mobile 其他手机开发 敏捷开发 项目与团队管理 软件工程其他 SQL Server Oracle MySQL NoSQL 其它数据库 Windows 7 Windows Server Linux
脚本语言: vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程
网站开发: CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 美食菜谱 新闻资讯 电影视频 小游戏 Chinese Culture 股票 三丰软件 开发 中国文化 网文精选 阅读网 看图 日历 万年历 2018年8日历
2018-8-15 3:19:03
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT知识库