ILSpy工具使用

Reflector是.NET開發中必備的反編譯工具。即便沒有用在反編譯領域,也經常用它來檢查程序集的命名規範,命名空間是否合理,組織類型的方法是否須要改善。舉例說明,它有一個能夠查看程序集完整名稱的功能,請看下圖app

image

這裏的Name,是標識一個程序集的完整標識,當GAC中存在程序集的多個版本時,這個名稱是惟一的識別名稱。框架

可是,Reflector很早就轉向收費軟件了,須要購買許可纔可使用。對於恥於用盜版的朋友,一般會放棄。有朋友說,Reflector並無增長更霸道的功能,卻轉向收費,使人費解。再看看市場上的.NET反編譯軟件,被Reflector擊潰。工具

一提到Reflector,說到.NET反編譯,Reflector經常是默認的首選工具。學習

這裏提起一下Visual Studio的壟斷。Visual Studio佔據了.NET開發工具系列的絕對壟斷地位。在.NET 1.x時代,還有C# Builder,Delphi.NET來使用和體驗,一爭高低。但是到後來,.NET Framwork更新頻繁,動轍在編譯器級別,和語言層面作更新,這令第三方的軟件開發工具商很是苦惱,這些工具也從市場上慢慢消聲匿跡,幾乎沒有第三方的軟件開發商願意開發.NET開發工具與Visual Studio一爭高低。沒有了競爭,進步的速度要慢不少。Visual Studio 2008差很少就是Visual Studio 2005+SP的替代品,在工具層面,Visual Studio 2005 SP1加上了Web Application,就是Visual Studio 2008。雖說語言層面是進步了不少,.NET 3.0,.NET 3.5,LINQ, 框架方法增長:WCF,WPF,WF,可是,我一直認識從2005到2008,它在工具層面沒有什麼進步。 

SharpDevelop 是除Visual Studio外,另外一個可選擇的惟一的.NET開放工具,而且它是開源的。它提供的功能也至關不錯,幾乎就是在重寫Visual Studio。最新的版本中,直接增長了對Visual Studio的解決方安案文件和項目文件的支持。ILSpy是SharpDevelop小組的反編譯工具,也是開放源代碼的,今天來介紹一下它的調試器和反編譯器,以讓那個收費的,卻沒有增長霸道功能的Reflector out。開發工具

clip_image001

ILSpy的界面與Reflector類似,左邊以樹型控件顯示程序集和它的類型,右邊是對應的源代碼。基礎的反編譯功能,與Reflector相比,絲絕不差,甚至有時候用Reflector沒法反編譯(由於加密)的程序集,用ILSpy能夠反編譯。 優化

Decompiler 反編譯器

基礎的類型反編譯功能都具有,如今只支持把源代碼反編譯爲C#和IL語言,不支持VB。ui

clip_image001[19]

當須要找的程序集是.NET框架時,能夠直接從菜單File—Open from GAC中打開須要查看源碼的程序集。加密

image

代碼保存功能也作得不錯,當點擊一個類型時,選擇File->Save Code會反編譯當前的類型並保存到指定的文件中,當選擇程序集時,Save Code保存爲一個項目(csproj)文件,而且把它全部的類型加到這個項目中。.net

 

Debugger 調試器

這裏要說的調試器,不是指Visual Studio的源碼級別的調試器,而是指程序集的調試器。Reflector有個Addin,能夠直接附加在Visual Studio中,調試第三方的類型庫,而不須要把第三方的類型庫反編譯後,以源碼的形式添加到項目中。開放源代碼

ILSpy也有這個功能,直接對第三方的程序集進行調試,有兩種選項

若是第三方類型庫是可執行程序(EXE),能夠用Debug an executable來啓動這個程序。

若是第三方類型庫是程序集(DLL),能夠用Attach to running application來附加,以啓動程序集的調試。

clip_image001[7]

從上面兩張圖中已經能夠看出它的用法,和調試源代碼同樣。在須要監視變量值的方法的地方,設置斷點,當程序運行到此時,就能夠經過監視窗體來觀察變量的值。從ILSpy的狀態欄中看出,上面的第一張圖是正處於調試狀態,第二張圖,是準備就緒,能夠進行調試。

這二者的區別是,Attach to a running application調試時,若是代碼通過編譯器優化,則監視器會沒法獲得它的值。

clip_image001[9]

如圖所示,沒法顯示正在調試的變量num的值,由於代碼已經通過優化。官方推薦的方式是Debug an executable


與在Visual Studio中調試.NET源代碼同樣,你能夠Step into,Step over,continue,同時狀態欄會顯示就緒(stand by),運行中(running),正在調試(debugging)。

clip_image001[11]

除了調試程序集的C#/VB形式的代碼以外,也能夠以IL代碼形式調試,以下圖所示

clip_image001[13]

由此看來,這仍是至關不錯的調試IL代碼的工具。工具能夠促進學習的效果,學習領悟以後,又能夠推動工具的發展,這就是知識的無止境的發展。

ILSpy的debugger是以插件形式存在的,請確保包含ILSpy.Debugger的Plugin。

clip_image001[15]

根據咱們的理解,調試.NET程序集必定須要PDB文件才能夠。然而ILSpy卻沒有產生PDB文件(no PDB files are generated),並且它不能夠調試ASP.NET Web application和Web 服務。 
這其中的原理,不甚明白。compiler/debugger一直是我喜好的技術主題,但學識膚淺,沒法分享。 

 

Reflector會檢測到系統時間超過了它預設的時間,若是不升級,它會主動刪除本身,從你的電腦中out掉。若是你對此很煩惱,那就讓它out吧,你能夠有另外一個選擇,試試ILSpy,或許會帶來一絲的驚喜。

相關文章
相關標籤/搜索