详解.NET IL代码

IL是什么?

 Intermediate Language (IL)微软中间语言

C#代码编译过程?

C#源代码通过LC转为IL代码,IL主要包含一些元数据和中间语言指令;

JIT编译器把IL代码转为机器识别的机器代码。如下图

语言编译器:无论是VB code还是C# code都会被Language Compiler转换为MSIL

MSIL的作用:MSIL包含一些元数据和中间语言指令

JIT编译器的作用:根据系统环境将MSIL中间语言指令转换为机器码

为什么ASP.NET网站第一次运行时会较慢,而后面的执行速度则会相对快很多?

当你第一次运行.NET开发的站点时,CLR会将MSIL通过JIT进行编译,最终转换为执行速度非常快的Native Code。这可以解释。

为什么要了解IL代码?

如果想学好.NET,IL是必须的基础,IL代码是.NET运行的基础,当我们对运行结果有异议的时候,可以通过IL代码透过表面看本质;

IL也是更好理解、认识CLR的基础;

大量的实例分析是以IL为基础的,所以了解IL,是读懂他人代码的必备基础,同时自己也可以获得潜移默化的提高;

二、如何把ILDasm导入到VS中

想要看IL代码需要使用ILDasm工具,工具一般在电脑的

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\ildasm.exe

也可以下载ILSpy:http://ilspy.net/

把ILDasm导入到VS工具中,使用方便,具体如下:工具 - > 外部工具 

  

导入之后,vs工具里面就有ILDasm工具了。以后想看IL代码方便多了。

IL代码通过ILDasm反编译后(左图),ILDasm图标意义(右图)

  

三、分析IL代码

在分析IL代码之前,要先理解几个概念:

图片来源:.NET中間語言(IL) | Microsoft Learn

Managed Heap(托管堆):这就是NET中的托管堆,用来存放引用类型,它是由GC(垃圾回收器自动进行回收)管理;

Call Stack(调用堆栈):调用堆栈:调用堆栈是一个方法列表,按调用顺序保存所有在运行期被调用的方法。

Evaluation Stack(计算堆栈):每个线程都有自己的线程栈,IL 里面的任何计算,都发生在 Evaluation Stack 上,其实就是一个 Stack 结构。可以 Push,也可以 Pop。

可以对照IL指令:指令列表,一步一步来分析IL代码

1、用C#写一个简单控制台应用程序

using System;namespace ILDemo
{class Program{static void Main(string[] args){int i = 1;int j = 2;int k = 3;int answer = i + j + k;Console.WriteLine("i+j+k=" + answer);Console.ReadKey();}}
}

2、 用ILDasm打开bin下的.exe文件查看代码,具体IL代码如下:

.method private hidebysig static void  Main(string[] args) cil managed
{.entrypoint // 代码大小       42 (0x2a).maxstack  2.locals init ([0] int32 i,[1] int32 j,[2] int32 k,[3] int32 answer)IL_0000:  nopIL_0001:  ldc.i4.1IL_0002:  stloc.0IL_0003:  ldc.i4.2IL_0004:  stloc.1IL_0005:  ldc.i4.3IL_0006:  stloc.2IL_0007:  ldloc.0IL_0008:  ldloc.1IL_0009:  addIL_000a:  ldloc.2IL_000b:  addIL_000c:  stloc.3IL_000d:  ldstr      "i+j+k="IL_0012:  ldloc.3IL_0013:  box        [mscorlib]System.Int32IL_0018:  call       string [mscorlib]System.String::Concat(object,object)IL_001d:  call       void [mscorlib]System.Console::WriteLine(string)IL_0022:  nopIL_0023:  call       valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()IL_0028:  popIL_0029:  ret
} // end of method Program::Main

3、会用到的IL指令:

nop:无操作

ret:从当前方法返回,并将返回值(如果存在)从调用方的计算堆栈推送到被调用方的计算堆栈上。

call:调用由传递的方法说明符指示的方法。

box:将值类转换为对象引用,就是装箱,同理可以知道拆箱unbox

ldc.i4.X:把int32的值推送到计算堆栈

stloc.X:把计算堆栈顶部的值放到调用堆栈索引为X处

ldloc.X:把调用堆栈X处的值复制到计算堆栈

4、理解注释后的代码

.method private hidebysig static void  Main(string[] args) cil managed
{.entrypoint  //程序入口// 代码大小       42 (0x2a).maxstack  2    // 计算出计算堆栈的能存几个值.locals init ([0] int32 i,[1] int32 j,[2] int32 k,[3] int32 answer) //定义int32类型的i,j,k,answerIL_0000:  nop   //无操作IL_0001:  ldc.i4.1  //把i的值放到计算堆栈上IL_0002:  stloc.0   //把计算堆栈顶部的值(i的值)放到调用堆栈索引0处IL_0003:  ldc.i4.2  //把j的值放到计算堆栈上IL_0004:  stloc.1   //把计算堆栈顶部的值(j的值)放到调用堆栈索引1处IL_0005:  ldc.i4.3  //把k的值放到计算堆栈上IL_0006:  stloc.2   //把计算堆栈顶部的值(k的值)放到调用堆栈索引2处IL_0007:  ldloc.0   //把调用堆栈索引为0处的值复制到计算堆栈 IL_0008:  ldloc.1   //把调用堆栈索引为1处的值复制到计算堆栈IL_0009:  add       //相加IL_000a:  ldloc.2   //把调用堆栈索引为2处的值复制到计算堆栈IL_000b:  add       //相加IL_000c:  stloc.3   //把计算堆栈顶部的值(add的值)放到调用堆栈索引3处IL_000d:  ldstr      "i+j+k="  //推送对元数据中存储的字符串的新对象引用。IL_0012:  ldloc.3   //把调用堆栈索引为3处的值复制到计算堆栈IL_0013:  box        [mscorlib]System.Int32     //装箱IL_0018:  call       string [mscorlib]System.String::Concat(object,object)   //调用内部方法IL_001d:  call       void [mscorlib]System.Console::WriteLine(string)       //调用WriteLineIL_0022:  nop       //无操作IL_0023:  call       valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()  //调用ConsoleKeyIL_0028:  pop      //无操作IL_0029:  ret      //return
} // end of method Program::Main

四、最后

IL是跟我高级架构经理的分享和博客园相关的博客学习总结的,最后留2个题目,也是我的高级架构经理分享中提到的两个好玩的问题,也能看出对IL的掌握的程度

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/256598.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

桌面宠物大全

无聊收集的: 桌面宠物大全 24个桌面宠物 类似种种,总之花了很多精力,将网上能见到的基本都收录了。其中:无需汉化的25个、盛华汉化的255个、未能汉化的32个,共312个。 看看自己朝夕相处的电脑桌面,还是一如既往的一片寂静,太没有气氛了。今天就给大家介绍几个好玩的桌…

为什么职场中35岁之后很难找到合适的工作?

(点击即可收听) 为什么职场中35岁之后很难找到合适的工作 无论是初入职场还是,职场多年的老司机,都听过一个35岁危机的一个话题 无论是企业还是一些招聘者,针对35,甚至就是30的人,充满了不是这样,就是那样的偏见的理由 每个公司都喜欢有激情,有想法,有干劲的年轻人,无论哪个公司…

读数据压缩入门笔记03_VLC

1. 概率、熵与码字长度 1.1. 数据压缩的目的 1.1.1. 给定一个数据集中的符号,将最短的编码分配给最可能出现的符号 1.2 1.2.1. 当P(A)P(B),也就是两个符号等可能出现时,数据集对应的熵取最大值LOG2(符号的个数)&…

《计算机组成原理》唐朔飞 第7章 指令系统 - 学习笔记

写在前面的话:此系列文章为笔者学习计算机组成原理时的个人笔记,分享出来与大家学习交流。使用教材为唐朔飞第3版,笔记目录大体与教材相同。 网课 计算机组成原理(哈工大刘宏伟)135讲(全)高清_…

HTTPX从入门到放弃

1. 什么是HTTPX? HTTPX是一款Python栈HTTP客户端库,它提供了比标准库更高级别、更先进的功能,如连接重用、连接池、超时控制、自动繁衍请求等等。HTTPX同时也支持同步和异步两种方式,因此可以在同步代码和异步代码中通用。 HTTP…

FPGA纯vhdl实现XGMII接口10G万兆网UDP协议 配合10G Ethernet PCS/PMA使用 提供工程源码和技术支持

目录 1、前言2、我这里已有的UDP方案3、详细设计方案本 10G-UDP 协议栈功能和性能描述本 10G-UDP 协议栈设计框图用户发送AXIS接口描述用户接收AXIS接口描述控制接口描述XGMII接口描述 4、vivado工程详解10G-UDP协议栈10G Ethernet PCS/PMA IP核 5、上板调试验证并演示6、福利&…

iOS 13修复了FaceTime最大的烦恼之一

黑客技术 点击右侧关注,了解黑客的世界! Java开发进阶 点击右侧关注,掌握进阶之路! Linux编程 点击右侧关注,免费入门到精通! iOS 13 第三个开发者 beta 版本增加了一个新功能,可以让用户在 Fac…

多人聊天、预约会议,FaceTime登录Windows和Android系统

整理 | Carol 出品 | CSDN(ID:CSDNnews) 在一年一度的WWDC苹果开发者盛会中,Apple除了宣布引入iOS15以外,还宣布将面向Windows和Android用户开放FaceTime。而过去,这项能力只能在iOS和Mac设备上试用。 Face…

iPhone曝严重漏洞,用户接听FaceTime前或被“监听”!

作者 | 琥珀 出品 | AI科技大本营(ID: rgznai100) 近日,据 9to5Mac 等多家外媒报道,苹果手机 FaceTime 一项重大漏洞被曝光,该漏洞可以让用户通过 FaceTime 群聊功能(Group FaceTime)打电话给任…

黑苹果facetime_如何在消息或FaceTime中添加或删除电话号码

黑苹果facetime If you have an iPhone and a Mac or iPad, you can link your phone number to your iCloud account to send and receive calls and messages from the same number on both devices. 如果您拥有iPhone和Mac或iPad,则可以将电话号码链接到iCloud帐…

苹果 iOS 15 正式发布

本文转载自IT之家 IT之家 6 月 8 日消息 今日凌晨,苹果召开 WWDC21 全球开发者大会,正式公布了全新 iOS 15 系统。 IT之家了解到,在 iOS 15 系统中,苹果带来了全新 FaceTime 与通知界面,并对照片、天气、钱包、地图等…

【苹果imessage相册推信】黑apple苹果经常出现FaceTime群设备推和Imessage群发设备推

黑色苹果经常出现FaceTime和Imessage,无法正常登录。 需要正常登录,你需要提到3码,一些帖子甚至复制在真正的白色苹果机上方。 但实际上,我希望上述服务将正常使用,我们需要补充SMUUID,BoardSerialNumber和…

FaceTime 在苹果电脑macOS与iPhone iOS上视频聊天配置步骤

FaceTime 在macOS与iPhone视频聊天配置步骤 前提,毫无疑问,你要有Apple ID。 1,在苹果电脑,到Applications目录下打开运行FaceTime 2,还是在电脑,输入你的Apple ID 3,还是在电脑,这里…

iMessage, Facetime 解决办法

不需要白苹果三码,亲测可用:原帖地址: https://www.reddit.com/r/hackintosh/comments/2wohwn/getting_imessage_working_on_10102_generating/ 感谢原帖的大神,感谢搜索。如果你得到一个错误信息,那么你很辛运。这意味…

【苹果推软件】安装OS imessage和faceTime

推荐内容IMESSGAE相关 作者推荐内容参考此文档来操作 *** 点击即可查看作者要求内容信息作者推荐内容1.参考此文档来操作 *** 点击即可查看作者要求内容信息作者推荐内容2.参考此文档来操作 *** 点击即可查看作者要求内容信息作者推荐内容3.参考此文档来操作 *** 点击即可查看…

如何解决FaceTime在苹果Mac上不起作用的问题?

由于多种原因,FaceTime无法在Mac上正常工作。在某些情况下,该应用程序行为不正常或将您注销,因此您将无法使用FaceTime。同样,如果您在使用相机或麦克风时遇到问题,Mac的日期和时间不正确,或者互联网连接状…

黑苹果解决 iMessage 与 Facetime 以及苹果三码的问题

教程来自http://www.heimac.net 若有侵权,及时私信我删除本文,再次感谢! 作者:超级管理员 黑苹果经常出现Facetime 和 iMessage 无法正常登陆。需要正常登陆则需要所说的白苹果 3 码,有些帖子甚至已经到真正的白苹果机…

C++ 和机器学习:使用 C++ 执行 ML 任务的简介

C 和机器学习:使用 C 执行 ML 任务的简介 介绍 C 是一种高性能编程语言,非常适合机器学习( ML ) 任务。尽管它在 ML 中可能不像 Python 或 R 那样流行,但它在速度和内存效率方面具有优势。 在本文中,我们将概述使用 C 执行 ML 任务…

【上篇】我们邀请了4位专家来探讨消费市场的新增量:W型机会、单客经济、日本市场、DTC......

好久不见了,我是增长黑盒的创始人yolo。最近我们总是发布一些严肃型的行业报告,相信大家的动作都是在第一时间点个收藏,然后....就没有然后了。 所以,今天我们的内容没有复杂的图表和数据,想用比较轻松的对话形式来呈现…

二、高通相机bringup 流程

和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、相机Sensor 点亮相关的文件二、Sensor 驱动文件详解 一、相机Sensor 点亮相关的文件 1.1 Sensor 驱动XML以及CPP文件 Sensor 文件路径:…