zoukankan      html  css  js  c++  java
  • 详解.NET IL代码(一)

      本文主要介绍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查看工具

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

       (1)ILDasm

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

        

        位置:C:Program Files (x86)Microsoft SDKsWindowsv7.0Ainildasm.exe,

        Microsoft SDKsWindows下的文件夹下有多个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即可

          开源地址:https://github.com/icsharpcode/ILSpy

         (3)Reflector 

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

         (4)LINQPad

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

          

        (5)Resharper

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

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

      (二)实例解析

           1.使用.net Reflector手动修改单个dll文件

          https://www.cnblogs.com/lycnblogs/p/5026413.html

    参考:

    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

  • 相关阅读:
    iOS- Swift:使用FMDB进行数据库操作(线程安全:增删改查)
    iOS- Swift:如何使用iOS8中的UIAlertController
    iOS- Swift和Object-C的混合编程
    iOS- 再谈ARC里内存问题,ARC里数组、对象内存得不到释放?
    iOS- 如何建立索引实现本地文本搜索引擎,允许容错搜索?
    iOS- 全方位解析.crash文件崩溃报告
    iOS- 关于AVAudioSession的使用——后台播放音乐
    iOS- Autolayout自动布局
    iOS- 详解如何使用ZBarSDK集成扫描二维码/条形码,点我!
    419. Roman to Integer【medium】
  • 原文地址:https://www.cnblogs.com/xcsn/p/3382306.html
Copyright © 2011-2022 走看看