详解.NET IL代码

news/2024/12/2 11:33:20/

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://www.ppmy.cn/news/112027.html

相关文章

台式电脑c语言如何安装,体验篇—Type-C如何连接电脑_固态硬盘评测-中关村在线...

》》体验篇——Type-C如何连接电脑《《 特科芯Type-C指纹加密SSD,顾名思义采用的是最新Type-C接口设计。可能有网友有疑问了,我的电脑并不是Type-C接口,买这样一款产品岂不是浪费?关于这一点大家尽管放心。新品正式首发的时候将会…

电脑耗电,装机不求人:电脑每个月耗电量有多少?

我们知道,只要电脑开机就会消耗电量,所以一些朋友对电脑的功率非常在意,那么电脑每个月的耗电量究竟有多少呢?下面笔者来为大家计算一下。 其实电脑的耗电量并不是一个固定的值,用电脑看视频和玩大型游戏的耗电量差距非…

中关村修电脑,被坑了

总结: 社会是复杂的,做事一定要多留一个心眼!这次修电脑,各种破绽(A座说是B座,店面编号也对不上,维修技能差到极点),只因自己不思考,而只是简单的选择相信。…

平板电脑可以打开HTML吗,网页体验 Flash无压力_平板电脑_平板电脑评测-中关村在线...

上网是平板电脑的必备功能,大屏幕以及触控操作的特点决定平板比手机看网页拥有更好的观赏体验,比电脑或者笔记本拥有更加便携的体形与重量。那么到底纽曼S2的网络体验怎样呢?让我们用事实说话。 Vellamo最终得分 首先,我们先用Vel…

平板android怎么玩电脑游戏,Android平板模拟家用主机游戏教程_小米 平板_平板电脑新闻-中关村在线...

一、NESoid 看完了上一页Windows系统模拟器介绍的网友应该能得出一个经验,一般模拟器的名称都和其模拟的游戏主机名称比较类似,所以很多模拟器都可以通过其名称判断出它到底是模拟谁的。比如这款NESoid,看名字就知道是模拟NES主机,也就是FC的了。 NESoid的操作界面实在是太…

中关村纪行

<中关村&#xff08;2019.1&#xff09;创新创业>研习报告 By Tex 前言 在三天的研习过程中&#xff0c;从最新技术概览、国内创业环境发展历程、国内当前创业氛围到创业园区的幼苗公司&#xff0c;发展强劲的大厂的概况&#xff0c;再到资金流运作&#xff0c;创业方法…

华为计算机电脑价格,听说你想换台电脑?(全文)_HUAWEI MateBook X Pro_笔记本导购-中关村在线...

生活当中很多人在买电子产品的时候都上过当&#xff0c;如果你现在想还买电脑可能身边人会这样劝你&#xff1a;买电脑不要去百脑汇&#xff0c;也不要去中关村。如果想买电脑&#xff0c;可以找个懂行的人问问&#xff0c;然后在网上下个单就搞定了。 可是…… 作为一名小白&a…

windows电脑改装android,黑科技让安卓秒变Windows_平板电脑评测-中关村在线

●黑科技让安卓秒变Windows Android系统下虽然也可以高效的处理一些文字性的工作&#xff0c;但日常绝大多数的办公需求都依托于Windows系统。AndroidWindows双系统是解决方案之一&#xff0c;但产品体验不佳。华为平板M5创新性地采用了云电脑的解决方案&#xff0c;借助云端服…