以前剛開始學C#的時候,總有高手跟我說,去了解一下IL代碼吧,看懂了你能更加清楚的知道你寫出來的代碼是如何運行互相調用的,可是那時候沒去看,后來補的,其實感覺也不晚。剛開始看IL代碼的時候,感覺非常吃力,一大堆不懂,后來,慢慢看,最后也能看得懂一丁點啦。
閑話不多說了,下面就開始講講IL代碼
1、什么是IL代碼
IL,也稱為CIL,MSIL,是.NET框架中中間語言(Intermediate Language)的縮寫。上一篇文章已經說過了,Visual Studio繼承的C#編譯器可以直接把C#寫的源程序編譯成.exe或.dll格式的文件,這些文件里面保存的就是IL代碼,這些代碼CPU是認不得的,只能再經過JIT編譯后,CPU才會執行。
2、How to Study IL
IL的代碼形式比較特殊,看起來會比較吃力,理解全部肯定更困難。但在這個世上有一個定律叫做“二八原則”,20%的人掌握着世上80%的財富。這在編程上也是一樣的,80%的功能其實只需要用20%的技術就可以完成了,但另外的20%,就有可能需要80%的技術了。學習IL代碼也是一樣,它有200多個指令(可以查看這里:IL指令),我們只要學習常用的20%就可以解決80%的問題了。不管怎么說,就是要多看,看多了自然就會懂了。
3、怎么查看源代碼
(1)先寫正常程序,通過編譯

(2)找Bin文件夾中找到exe后綴的文件
(3)拖入Reflector(我習慣用這個來看反編譯代碼),也可以使用別的反編譯軟件,比如ILDasm,ILSpy等。初學者我是建議使用ILDasm,因為這是微軟自帶的。
我在網上找了兩張圖,是使用ILDasm的,大家可以參考借鑒一下。


上面兩張圖是用ILDasm的。而我還是習慣用Reflector。

上圖的右邊就是傳說中的IL代碼了,看起來復雜嗎?應該不復雜吧,來,再多看幾眼......下面我就一句一句來解釋。
//Call Stack是調用棧,一個局部變量列表,用於存儲.locals init([0] int32 num,[1] int32 num2,[2] int32 num3)初始化變量。
//Evaluation Stack也是一個評估棧,用來存儲值,比如ldc.i4.1這種指令會把1壓入棧中等待操作。
//棧是一種先進后出的數據結構。
//hidebysig指令表示如果當前類為父類,用該指令標記的方法將不會被子類繼承 |
以上的IL代碼算是比較簡單的一段代碼,因為沒有條件判斷等流程控制。但只要記住每一條IL指令固定的操作,我覺得也不難。接下來會寫第二部分,主要寫引用類型的IL代碼,更深入理解IL代碼。
