說(shuō)起.NET反編譯,這里提起一下Visual Studio的壟斷。Visual Studio占據(jù)了.NET開(kāi)發(fā)工具系列的絕對(duì)壟斷地位。在.NET 1.x時(shí)代,還有C# Builder,Delphi.NET來(lái)使用和體驗(yàn),一爭(zhēng)高低。可是到后來(lái),.NET Framwork更新頻繁,動(dòng)轍在編譯器級(jí)別,和語(yǔ)言層面做更新,這令第三方的軟件開(kāi)發(fā)工具商非?鄲,這些工具也從市場(chǎng)上慢慢消聲匿跡,幾乎沒(méi)有第三方的軟件開(kāi)發(fā)商愿意開(kāi)發(fā).NET開(kāi)發(fā)工具與Visual Studio一爭(zhēng)高低。沒(méi)有了競(jìng)爭(zhēng),進(jìn)步的速度要慢很多。
Visual Studio 2008差不多就是Visual Studio 2005+SP的替代品,在工具層面,Visual Studio 2005 SP1加上了Web Application,就是Visual Studio 2008。雖然說(shuō)語(yǔ)言層面是進(jìn)步了很多,.NET 3.0,.NET 3.5,LINQ, 框架方法增加:WCF,WPF,WF,但是,我一直認(rèn)識(shí)從2005到2008,它在工具層面沒(méi)有什么進(jìn)步。
SharpDevelop 是除Visual Studio外,另一個(gè)可選擇的唯一的.NET開(kāi)放工具,并且它是開(kāi)源的。它提供的功能也相當(dāng)不錯(cuò),幾乎就是在重寫(xiě)Visual Studio。最新的版本中,直接增加了對(duì)Visual Studio的解決方安案文件和項(xiàng)目文件的支持。ILSpy是SharpDevelop小組的反編譯工具,也是開(kāi)放源代碼的,今天來(lái)介紹一下它的調(diào)試器和反編譯器,以讓那個(gè)收費(fèi)的,卻沒(méi)有增加霸道功能的Reflector out。
ILSpy的界面與Reflector相似,左邊以樹(shù)型控件顯示程序集和它的類(lèi)型,右邊是對(duì)應(yīng)的源代碼;A(chǔ)的反編譯功能,與Reflector相比,絲毫不差,甚至有時(shí)候用Reflector無(wú)法反編譯(因?yàn)榧用?的程序集,用ILSpy可以反編譯。
Decompiler 反編譯器
基礎(chǔ)的類(lèi)型反編譯功能都具備,現(xiàn)在只支持把源代碼反編譯為C#和IL語(yǔ)言,不支持VB。
當(dāng)需要找的程序集是.NET框架時(shí),可以直接從菜單File—Open from GAC中打開(kāi)需要查看源碼的程序集。
代碼保存功能也做得不錯(cuò),當(dāng)點(diǎn)擊一個(gè)類(lèi)型時(shí),選擇File->Save Code會(huì)反編譯當(dāng)前的類(lèi)型并保存到指定的文件中,當(dāng)選擇程序集時(shí),Save Code保存為一個(gè)項(xiàng)目(csproj)文件,并且把它所有的類(lèi)型加到這個(gè)項(xiàng)目中。
Debugger 調(diào)試器
這里要說(shuō)的調(diào)試器,不是指Visual Studio的源碼級(jí)別的調(diào)試器,而是指程序集的調(diào)試器。Reflector有個(gè)Addin,可以直接附加在Visual Studio中,調(diào)試第三方的類(lèi)型庫(kù),而不需要把第三方的類(lèi)型庫(kù)反編譯后,以源碼的形式添加到項(xiàng)目中。
ILSpy也有這個(gè)功能,直接對(duì)第三方的程序集進(jìn)行調(diào)試,有兩種選項(xiàng)
如果第三方類(lèi)型庫(kù)是可執(zhí)行程序(EXE),可以用Debug an executable來(lái)啟動(dòng)這個(gè)程序。
如果第三方類(lèi)型庫(kù)是程序集(DLL),可以用Attach to running application來(lái)附加,以啟動(dòng)程序集的調(diào)試。
從上面兩張圖中已經(jīng)可以看出它的用法,和調(diào)試源代碼一樣。在需要監(jiān)視變量值的方法的地方,設(shè)置斷點(diǎn),當(dāng)程序運(yùn)行到此時(shí),就可以通過(guò)監(jiān)視窗體來(lái)觀察變量的值。從ILSpy的狀態(tài)欄中看出,上面的第一張圖是正處于調(diào)試狀態(tài),第二張圖,是準(zhǔn)備就緒,可以進(jìn)行調(diào)試。
這兩者的區(qū)別是,Attach to a running application調(diào)試時(shí),如果代碼經(jīng)過(guò)編譯器優(yōu)化,則監(jiān)視器會(huì)無(wú)法得到它的值。
如圖所示,無(wú)法顯示正在調(diào)試的變量num的值,因?yàn)榇a已經(jīng)經(jīng)過(guò)優(yōu)化。官方推薦的方式是Debug an executable
與在Visual Studio中調(diào)試.NET源代碼一樣,你可以Step into,Step over,continue,同時(shí)狀態(tài)欄會(huì)顯示就緒(stand by),運(yùn)行中(running),正在調(diào)試(debugging)。
除了調(diào)試程序集的C#/VB形式的代碼之外,也可以以IL代碼形式調(diào)試,如下圖所示
由此看來(lái),這還是相當(dāng)不錯(cuò)的調(diào)試IL代碼的工具。工具可以促進(jìn)學(xué)習(xí)的效果,學(xué)習(xí)領(lǐng)悟之后,又可以推進(jìn)工具的發(fā)展,這就是知識(shí)的無(wú)止境的發(fā)展。
ILSpy的debugger是以插件形式存在的,請(qǐng)確保包含ILSpy.Debugger的Plugin。
根據(jù)我們的理解,調(diào)試.NET程序集一定需要PDB文件才可以。然而ILSpy卻沒(méi)有產(chǎn)生PDB文件(no PDB files are generated),而且它不可以調(diào)試ASP.NET Web application和Web 服務(wù)。
這其中的原理,不甚明白。compiler/debugger一直是我喜愛(ài)的技術(shù)主題,但學(xué)識(shí)膚淺,無(wú)法分享。
Reflector會(huì)檢測(cè)到系統(tǒng)時(shí)間超過(guò)了它預(yù)設(shè)的時(shí)間,如果不升級(jí),它會(huì)主動(dòng)刪除自己,從你的電腦中out掉。如果你對(duì)此很煩惱,那就讓它out吧,你可以有另一個(gè)選擇,試試ILSpy,或許會(huì)帶來(lái)一絲的驚喜。