iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 9
2
Software Development

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

使用ILSpy將中繼語言(IL)轉換成C#

  • 分享至 

  • xImage
  •  

  進公司之後有很大機會要維護公司舊有的專案,而這個專案很有可能是前輩代代相傳而來的,裡面可能用到許多類別分布在不同的命名空間,但傳到你手中時你的Visual Studio專案檔打開來卻少了某些類別的原始碼,只留下那些編譯後類別所在的.dll檔。幸運的是前輩有留下各個類別的使用方式說明文件,我們不用知道那些類別的原始碼是什麼,只要知道類別的使用方式,就可以輕鬆地完成我們的維護工作。這在物件導向程式語言中有個專有術語叫做--封裝

  封裝有時候會稱作資訊隱藏或是關注點分離,在物件導向的世界觀中,一個系統不是只靠一個人所打造出來的,而是切分成不同的工作分配給每個人,大家不用在意其他人工作的資訊細節,只要關注於自己的工作,最後將每個人的成果組合起來合力打造出一個系統。

  不過如果有一天,系統發生問題了,而問題發生在某位前輩所撰寫的類別中某個方法,這個方法輸出的結果不如預期,你只有前輩留下來的.dll檔,卻沒有原始碼留下來要怎麼處理呢?,這個時候ILSpy就派上用場了!

ILSpy

  ILSpy是一個開源工具,可以將C#編譯而成的.dll或.exe等可執行檔,依照其中的中繼語言(IL)與相關資訊轉換為C#程式碼。而這一個將C#編譯出的IL再轉換回原本的C#的過程,專業術語叫做反編譯。以上內容其實可以簡單想成中文翻譯成英文後,再從英文翻譯成中文,在其他程式語言中,反編譯可能會有些資訊流失,就像翻譯過後的文章再翻譯回去不一定會跟原文完全一模一樣。不過原本程式的相關細節C#編譯器在編譯時會寫在中繼資料中,所以透過ILSpy翻譯回C#程式碼,我能說整個程式的相關邏輯至少9成9一樣。

下載ILSpy

我們可以在GitHub上找到這個開源工具。
https://ithelp.ithome.com.tw/upload/images/20190925/201204202mA6YVOMqF.png

在下方有提供下載連結,我們選擇最新發行版。
https://ithelp.ithome.com.tw/upload/images/20190925/20120420DqipP3SoqQ.png

首先會出現最新版的特色介紹。
https://ithelp.ithome.com.tw/upload/images/20190925/201204200IQzgIcJHd.png

下面就有安裝檔的類型連結。有提供幾種類型,例如第一個是以NuGet套件的方式安裝,第二個是以Visual Studio的外掛程式安裝,這邊我選擇第三個ILSpy的免安裝執行檔壓縮檔進行下載。
https://ithelp.ithome.com.tw/upload/images/20190925/20120420TLnYfcBfi4.png

執行ILSpy

  下載後將壓縮檔放入一個新資料夾中解壓縮後,點擊ILSpy.exe來執行。ILSpy是用.NET技術開發的,所以這個免安裝檔要在有安裝.NET Framework的環境下才能執行。打開後會看到我們.NET Framework類別庫的相關組件的原始碼。
https://ithelp.ithome.com.tw/upload/images/20190925/20120420GowjlfzpQp.png

我們從左上角[File] > 在點擊 [Open]選擇我們昨天的範例程式ConsoleAppTest.exe。我們的ConsoleAppTest就出現在左邊的目錄中,展開後點擊Program就看到我們撰寫的程式被反編譯成原本的C#程式碼了。
https://ithelp.ithome.com.tw/upload/images/20190925/20120420ZYeIUcqdBg.png

在ILSpy中我們可以從下拉式選單中選擇C#版本,因為有些C#的新語法其實由舊版本重新在包裝而來,編譯後的IL其實是一樣的,透過這個方式將程式轉換成不同版本的語法。
https://ithelp.ithome.com.tw/upload/images/20190925/20120420LzAyq1EriU.png

我們也可以透過下拉式選單選擇IL,來看編譯器編譯後的前後差異。
https://ithelp.ithome.com.tw/upload/images/20190925/20120420xGgvldmzm6.png

最後

  ILSpy這個工具可以方便我們查看.NET程式的原始碼,當然這是指前輩沒留下原始碼只剩.NET可執行檔的情況下,何況這些檔案類型是.NET的部屬單位,若你的.NET檔案要供其他人使用,我個人認為要以開放心態、直接提供原始碼的方式來撰寫.NET程式。當然除了ILSpy也有其他相似的工具,甚至有的能把IL選擇轉換成VB.NET的程式語法,當然如果你的C#程式碼中如果用到不符合CLS規範例如Uint型別那就沒辦法轉成VB,畢竟VB沒有Uint這個型別。


上一篇
使用ILDASM看C#編譯出的中繼語言(IL)
下一篇
一些物件導向之前的事
系列文
我要轉職成 C# / .NET 工程師34
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

2
YoChen
iT邦研究生 1 級 ‧ 2019-11-07 15:52:40

竟然有這麼好用的工具以前都不知道!!~XDDD
感謝大大分享,獲益良多~

長庚 iT邦新手 3 級 ‧ 2019-11-18 13:24:57 檢舉

寫了那們久的文後,看到有人回應受益的感想,真的好感動~~~
謝謝你的回應!

我要留言

立即登入留言