天天看點

Reflector 已經out了,試試ILSpy

reflector是.net開發中必備的反編譯工具。即使沒有用在反編譯領域,也常常用它來檢查程式集的命名規範,命名空間是否合理,組織類型的方法是否需要改善。舉例說明,它有一個可以檢視程式集完整名稱的功能,請看下圖

Reflector 已經out了,試試ILSpy

這裡的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。

Reflector 已經out了,試試ILSpy

ilspy的界面與reflector相似,左邊以樹型控件顯示程式集和它的類型,右邊是對應的源代碼。基礎的反編譯功能,與reflector相比,絲毫不差,甚至有時候用reflector無法反編譯(因為加密)的程式集,用ilspy可以反編譯。 

基礎的類型反編譯功能都具備,現在隻支援把源代碼反編譯為c#和il語言,不支援vb。

Reflector 已經out了,試試ILSpy

當需要找的程式集是.net架構時,可以直接從菜單file—open from gac中打開需要檢視源碼的程式集。

Reflector 已經out了,試試ILSpy

代碼儲存功能也做得不錯,當點選一個類型時,選擇file->save code會反編譯目前的類型并儲存到指定的檔案中,當選擇程式集時,save code儲存為一個項目(csproj)檔案,并且把它所有的類型加到這個項目中。

這裡要說的調試器,不是指visual studio的源碼級别的調試器,而是指程式集的調試器。reflector有個addin,可以直接附加在visual studio中,調試第三方的類型庫,而不需要把第三方的類型庫反編譯後,以源碼的形式添加到項目中。

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

如果第三方類型庫是可執行程式(exe),可以用debug an executable來啟動這個程式。

如果第三方類型庫是程式集(dll),可以用attach to running application來附加,以啟動程式集的調試。

Reflector 已經out了,試試ILSpy

從上面兩張圖中已經可以看出它的用法,和調試源代碼一樣。在需要監視變量值的方法的地方,設定斷點,當程式運作到此時,就可以通過監視窗體來觀察變量的值。從ilspy的狀态欄中看出,上面的第一張圖是正處于調試狀态,第二張圖,是準備就緒,可以進行調試。

這兩者的差別是,attach to a running application調試時,如果代碼經過編譯器優化,則螢幕會無法得到它的值。

Reflector 已經out了,試試ILSpy

如圖所示,無法顯示正在調試的變量num的值,因為代碼已經經過優化。官方推薦的方式是debug an executable

與在visual studio中調試.net源代碼一樣,你可以step into,step over,continue,同時狀态欄會顯示就緒(stand by),運作中(running),正在調試(debugging)。

Reflector 已經out了,試試ILSpy

除了調試程式集的c#/vb形式的代碼之外,也可以以il代碼形式調試,如下圖所示

Reflector 已經out了,試試ILSpy

由此看來,這還是相當不錯的調試il代碼的工具。工具可以促進學習的效果,學習領悟之後,又可以推進工具的發展,這就是知識的無止境的發展。

ilspy的debugger是以插件形式存在的,請確定包含ilspy.debugger的plugin。

Reflector 已經out了,試試ILSpy

根據我們的了解,調試.net程式集一定需要pdb檔案才可以。然而ilspy卻沒有産生pdb檔案(no pdb files are generated),而且它不可以調試asp.net web application和web 服務。 

這其中的原理,不甚明白。compiler/debugger一直是我喜愛的技術主題,但學識膚淺,無法分享。 

reflector會檢測到系統時間超過了它預設的時間,如果不更新,它會主動删除自己,從你的電腦中out掉。如果你對此很煩惱,那就讓它out吧,你可以有另一個選擇,試試ilspy,或許會帶來一絲的驚喜。

<a target="_blank" href="http://www.cnblogs.com/jamesli2015/archive/2011/09/08/2170519.html">原文位址</a>

繼續閱讀