iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 8
1
Software Development

我要轉職成 C# / .NET 工程師系列 第 8

使用ILDASM看C#編譯出的中繼語言(IL)

這篇文章我會先講一下微軟的ILDASM工具,下次再講ILSpy這個開源工具。

IL DASM

  我們撰寫的.NET相關程式經編譯器編譯成中繼語言後會包裝成.exe或.dll等可執行檔。在Visual Studio中,就有提供ildasm.exe這一個小工具,讓我們可以看到自己程式會編譯出什麼樣的中繼語言。(這個小工具只能看用.NET技術開發的可執行檔)

[開始]目錄尋找Visual Studio 2017,有一個[適用於VS2017的開發人員命令提示字元]
https://ithelp.ithome.com.tw/upload/images/20190924/20120420nYvYEnyRUs.png

  

打開後這個命令提示字元後輸入以下指令,就可以打開這一個小工具。
指令ildasm
https://ithelp.ithome.com.tw/upload/images/20190924/20120420cyWP0SVJfZ.png

  

點擊左上角的 [檔案] 再點擊 [開啟],然後選擇一個基於.NET開發的程式執行檔,就可以看其中的中繼語言(IL)。
https://ithelp.ithome.com.tw/upload/images/20190924/20120420FdzwLRI9HL.png

事先準備一下,我們先在Visual Studio中用先新建一個以C#撰寫的.NET Framework的主控台應用程式
我把專案名稱取名為ConsoleAppTest,先記一下專案的目錄位址,然後撰寫以下測試程式進行建置來編譯成執行檔

using System;

namespace ConsoleAppTest
{
    class Program
    {
        static void Main(string[] args)
        {
            
            string str = "Hello world";
            Console.WriteLine(str);
            
        }
    }
}

  簡單寫兩行程式,因為在Console.WriteLine(str);後面沒有加上Console.ReadKey();來讓程式停下來,所以這支程式直接執行會在顯示Hello world後直接關閉。沒關係,因為我們的目的只是看其中的IL而已。去專案的bin資料中尋找編譯而成ConsoleAppTest.exe,並用IL DASM工具來開啟。

  

  打開後就可以看到我們程式的IL與中繼資料,這些中繼資料等自我描述資料位於Manifest裡面,而下方就是我們的測試程式ConsoleAppTest的結構。
https://ithelp.ithome.com.tw/upload/images/20190924/20120420W5PxSRgwTk.png

    

可以看到我們主程式Main方法前面有個符號,粉紅色方塊標示的是方法,方塊中間S符號是靜態Static,打開就能看到我們主程式的IL語法。
https://ithelp.ithome.com.tw/upload/images/20190924/20120420nAVJ2g6rNU.png

在裡面可以看到我們的字串"Hello world"大大的顯示在IL_0001中,而且也可以看到就算我們C#程式碼中使用using System;這個語法,編譯後的IL還是顯示使用.NET Framework類別庫mscorlib.dll裡面的System.Console::WriteLine(string)這個提供字串來顯示在螢幕上的方法。

整理一下

  C#有些便捷的語法是C#編譯器提供的功能,雖然今天C#8.0已經正式推出了,但從C#1.0到現在C#8.0的某些C#語法,其實編譯後的中繼語言可能都是一樣的。而中繼語言是一種類似組合語言的低階語言,雖然不好理解,但我們仍可閱讀出我們C#程式建立出Hello world並顯示出於螢幕上是拆解成好幾個步驟。這些步驟會經過JIT變成我們完全看不懂的機器指令。對於我們使用像C#這種高階語言的程式開發者來說,這些步驟細節被簡化被抽象化。
  
  相對C或C++撰寫的程式編譯後直接是人們無法看懂的機器語言,中繼語言包裝出來的.exe .dll等可執行檔是我們.NET程式部屬單位。若這些檔案中有密碼或金鑰,對拿到.NET程式的人來說是費點心力就可以知道的,除非密碼或金鑰來自於非.NET撰寫的程式,例如C或C++撰寫的程式以非受控(Unmanaged)方式被CLR使用。若你的.NET檔案要供其他人使用,我個人認為要以開放心態提供原始碼的方式來撰寫.NET程式。

(下次再講ILSpy工具)


上一篇
簡介C#編譯成IL,再由JIT編譯成機器碼的過程
下一篇
使用ILSpy將中繼語言(IL)轉換成C#
系列文
我要轉職成 C# / .NET 工程師34
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言