以前剛開始學C#的時候,總有高手跟我說,去瞭解一下IL代碼吧,看懂了你能更加清楚的知道你寫出來的代碼是如何運行互相調用的,可是那時候沒去看,後來補的,其實感覺也不晚。剛開始看IL代碼的時候,感覺非常吃力,一大堆不懂,後來,慢慢看,最後也能看得懂一丁點啦。 閑話不多說了,下麵就開始講講IL代碼 1、什
以前剛開始學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代碼。