详解.NET IL代码(一)
本文主要介紹IL代碼,內(nèi)容大部分來自網(wǎng)上,進(jìn)行整理合并的。
一、IL簡(jiǎn)介
為什么要了解IL代碼?
如果想學(xué)好.NET,IL是必須的基礎(chǔ),IL代碼是.NET運(yùn)行的基礎(chǔ),當(dāng)我們對(duì)運(yùn)行結(jié)果有異議的時(shí)候,可以通過IL代碼透過表面看本質(zhì);IL也是更好理解、認(rèn)識(shí)CLR的基礎(chǔ);大量的實(shí)例分析是以IL為基礎(chǔ)的,所以了解IL,是讀懂他人代碼的必備基礎(chǔ),同時(shí)自己也可以獲得潛移默化的提高;
什么是IL?
?IL是.NET框架中中間語言(Intermediate Language)的縮寫。使用.NET框架提供的編譯器可以直接將源程序編譯為.exe或.dll文件,但此時(shí)編譯出來的程序代碼并不是CPU能直接執(zhí)行的機(jī)器代碼,而是一種中間語言IL(Intermediate Language)的代碼(來源百度)。
? IL指令大全 ?點(diǎn)這里
?IL代碼編譯器 ILDasm ??點(diǎn)這里
C#代碼編譯過程?
C#源代碼通過LC轉(zhuǎn)為IL代碼,IL主要包含一些元數(shù)據(jù)和中間語言指令;JIT編譯器把IL代碼轉(zhuǎn)為機(jī)器識(shí)別的機(jī)器代碼。如下圖
語言編譯器:無論是VB code還是C# code都會(huì)被Language Compiler轉(zhuǎn)換為MSIL
MSIL的作用:MSIL包含一些元數(shù)據(jù)和中間語言指令
JIT編譯器的作用:根據(jù)系統(tǒng)環(huán)境將MSIL中間語言指令轉(zhuǎn)換為機(jī)器碼
為什么ASP.NET網(wǎng)站第一次運(yùn)行時(shí)會(huì)較慢,而后面的執(zhí)行速度則會(huì)相對(duì)快很多?
當(dāng)你第一次運(yùn)行.NET開發(fā)的站點(diǎn)時(shí),CLR會(huì)將MSIL通過JIT進(jìn)行編譯,最終轉(zhuǎn)換為執(zhí)行速度非常快的Native Code。這可以解釋。
關(guān)于這一部分,我也不大熟悉,以后再學(xué)習(xí)。
二、怎么查看IL代碼
(一)IL查看工具
現(xiàn)在可以查看IL的工具其實(shí)很多。
(1)ILDasm
打開vs,在工具 - > 外部工具 ,把ILDasm導(dǎo)入到VS工具中,具體如下:
位置:C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\ildasm.exe,
Microsoft SDKs\Windows下的文件夾下有多個(gè)ildasm,包括的版本有.NET 4.0 ,4.5.1,4.6,4.6.1,4.6.2等
在VS的工具下這時(shí)就可以看到,打開ILDasm,然后打開想看的dll或exe就可以了,IL代碼通過ILDasm反編譯后,如下:
符號(hào)解釋:
如果想查看IL,通過文件-轉(zhuǎn)儲(chǔ)保存下來就可以查看
(2)ILSpy
? 使用簡(jiǎn)單,注意:默認(rèn)選擇的是c#,改為IL即可
開源地址:https://github.com/icsharpcode/ILSpy
(3)Reflector?
這是也是很出名的,不介紹了,使用教材:https://www.cnblogs.com/Helius/p/5273116.html
(4)LINQPad
它實(shí)際是個(gè)對(duì)linq方面的工具,但也可以看IL
?
(5)Resharper
打開方法:vs的Resharper菜單欄-window-IL Viewer,隨時(shí)都可以查看
有條件的,建議使用,非常方便
(二)實(shí)例解析
? 1.使用.net Reflector手動(dòng)修改單個(gè)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
?
轉(zhuǎn)載于:https://www.cnblogs.com/xcsn/p/3382306.html
總結(jié)
以上是生活随笔為你收集整理的详解.NET IL代码(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java基础知识 多线程
- 下一篇: [翻译]创建ASP.NET WebApi