详解.NET IL代码(一)

简介:   本文主要介绍IL代码,内容大部分来自网上,进行整理合并的。 一、IL简介  为什么要了解IL代码?   如果想学好.NET,IL是必须的基础,IL代码是.NET运行的基础,当我们对运行结果有异议的时候,可以通过IL代码透过表面看本质;IL也是更好理解、认识CLR的基础;大量的实例分析是以IL为基础的,所以了解IL,是读懂他人代码的必备基础,同时自己也可以获得潜移默化的提高;  什么是IL?   IL是.NET框架中中间语言(Intermediate Language)的缩写。

  本文主要介绍IL代码,内容大部分来自网上,进行整理合并的。

一、IL简介

 为什么要了解IL代码?

  如果想学好.NET,IL是必须的基础,IL代码是.NET运行的基础,当我们对运行结果有异议的时候,可以通过IL代码透过表面看本质;IL也是更好理解、认识CLR的基础;大量的实例分析是以IL为基础的,所以了解IL,是读懂他人代码的必备基础,同时自己也可以获得潜移默化的提高;

 什么是IL?

  IL是.NET框架中中间语言(Intermediate Language)的缩写。使用.NET框架提供的编译器可以直接将源程序编译为.exe或.dll文件,但此时编译出来的程序代码并不是CPU能直接执行的机器代码,而是一种中间语言IL(Intermediate Language)的代码(来源百度)。

   IL指令大全  点这里

   IL代码编译器 ILDasm   点这里

 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代码

  (一)工欲善其事,必先利其器

   现在可以查看IL的工具其实很多。

   (1)ILDasm

    打开vs,在工具 - > 外部工具 ,把ILDasm导入到VS工具中,具体如下:

    

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

    Microsoft SDKs\Windows下的文件夹下有多个ildasm,包括的版本有.NET 4.0 ,4.5.1,4.6,4.6.1,4.6.2等

    在VS的工具下这时就可以看到,打开ILDasm,然后打开想看的dll或exe就可以了,IL代码通过ILDasm反编译后,如下:

    

    符号解释:

如果想查看IL,通过文件-转储保存下来就可以查看

    (2)ILSpy

     使用简单,注意:默认选择的是c#,改为IL即可,下载地址:http://ilspy.net/

     (3)Reflector 

      这是也是很出名的,不介绍了,使用教材:https://www.cnblogs.com/Helius/p/5273116.html

     (4)LINQPad

      它实际是个对linq方面的工具,但也可以看IL

      

 

    (5)Resharper

      打开方法:vs的Resharper菜单栏-window-IL Viewer,随时都可以查看

      有条件的,建议使用,非常方便

  (二)实例解析

       待续

 

 

 

参考:

http://www.cnblogs.com/zery/archive/2013/10/15/3366175.html

https://www.cnblogs.com/yinrq/p/5486103.html

http://www.jb51.net/article/39635.htm

https://www.cnblogs.com/tk091/archive/2012/09/01/2666810.html

 

相关文章
|
2月前
|
JSON IDE 前端开发
[.NET开发者的福音]一个方便易用的在线.NET代码编辑工具.NET Fiddle
[.NET开发者的福音]一个方便易用的在线.NET代码编辑工具.NET Fiddle
|
8月前
|
网络协议 算法 Shell
来我们探究一下net/http 的代码流程
来我们探究一下net/http 的代码流程
|
1月前
|
XML 开发框架 .NET
【.NET Core】常见C#代码约定
【.NET Core】常见C#代码约定
23 5
|
2月前
云效静态代码检测可以检测.net吗?
云效静态代码检测可以检测.net吗?
37 1
|
2月前
|
并行计算 算法 调度
(学习笔记)U-net++代码解读
python: 3.10 U-net++结构图
215 0
|
8月前
|
开发框架 前端开发 JavaScript
Asp.net动态加载用户自定义控件,并转换成HTML代码
Asp.net动态加载用户自定义控件,并转换成HTML代码
31 0
|
10月前
|
算法 编译器 API
|
11月前
|
机器学习/深度学习 数据采集 存储
【3-D深度学习:肺肿瘤分割】创建和训练 V-Net 神经网络,并从 3D 医学图像中对肺肿瘤进行语义分割研究(Matlab代码实现)
【3-D深度学习:肺肿瘤分割】创建和训练 V-Net 神经网络,并从 3D 医学图像中对肺肿瘤进行语义分割研究(Matlab代码实现)
205 0
|
12月前
|
网络协议 Shell Go
来我们一起探究一下net/http 的代码流程
是GO的其中一个标准库,用于Web应用的开发,使用这个库,可以让开发变得更加迅速和简便,且易于上手
|
机器学习/深度学习 算法
使用BP神经网络和Elman Net预测航班价格(Matlab代码实现)
使用BP神经网络和Elman Net预测航班价格(Matlab代码实现)