Dotnet IL Editor是一款.NET平臺反編譯工具,可以反編譯.NET程序集文件為IL代碼,并且可以執(zhí)行,調(diào)試反編譯后生成的IL代碼。它的設計出發(fā)點比較直觀,新建一個項目,添加程序集文件,設置斷點(F9),然后就可以調(diào)試反編譯后的程序集文件,Step Into,Step Out均可,以此原理,可以找到系統(tǒng)的瓶頸代碼,也可以深入的學習MSIL微軟中間語言。
調(diào)試IL代碼:
IL Editor的調(diào)試功能是它的亮點之一,可以在打開的IL代碼中直接設置斷點(F9, Toogle breakpoint),然后點擊工具欄中的Run,啟動調(diào)試。調(diào)試程序的幾個要點,看堆棧Stack, 看變量值Watch,IL Editor都可以做到。
IL堆棧窗口
IL參數(shù)窗口,可顯示當前被調(diào)用的方法的傳入?yún)?shù)
IL Watch窗口
表達式可以支持自定義的表達式,這個功能與VS中的即時窗口類似,輸入表量或表達式,右邊計算出結果。
IL Editor的作者列舉出了一些經(jīng)過測試,演示的表達式代碼,他們是
5 * -6 1 + 2 * 3 - 10 / 5 * 5 (1 + 2 * 3 - 10 / 5 * 5).ToString() (-5).ToString() new object() + "a" "abc".Length.ToString() System.Type.GetType("System.String").GUID.ToByteArray() TestApplication.DebugTest.CreateOperatorTest4("op1") | true TestApplication.DebugTest.ParamsTest2() TestApplication.DebugTest.ParamsTest2(5, 6) System.String.Format("{0}{1}{2}{3}{4}", "a", "b", "c", "d", "e") new object[] {4, "a", 5} ((System.Exception){exception}).Message TestApplication.GenericClass<int, System.DateTime>.StaticMethod<string>("test") new TestApplication.TestClass<int, string>[] {new TestApplication.TestClass<int, string>(1, "one")} TestApplication.GenericClass<int, string>.NestedGenericClass<System.Type>.StaticMixedMethod<System.DateTime>(System.DateTime.Now, 5, null)
是的,你可以直接在窗口中輸入,IL會對表達式求值,返回結果顯示到右邊。
最后看到執(zhí)行結果
控制上顯示輸出值,與在VS中調(diào)試C#源代碼的體驗完全相同。
學習IL指令集
IL Editor的作者肯定想到IL語言不容易記住和熟悉,當你在IL Editor中移動鼠標時,隨著鼠標當前行顯示的IL代碼的不同,在IL Instructions窗口中,會及時的顯示它的方法注釋,并顯示MSDN地址,可以直接點擊進入該IL方法的文檔。
設計的非常貼心周到。
Click here直接挑到MSDN網(wǎng)頁中。
http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.Nop.aspx
對于我們習慣的語言來說,還沒有看到有相關的設置,可以用來設置跳轉到中文版的MSDN上。
命令行調(diào)用
IL Editor支持命令行方式的調(diào)用,命令行的參數(shù)列表如下所示
dile [/p "Project name"] [/a "assembly path"] [/l "project name.dileproj"]
/p Optional. When DILE is loaded, a new project will be created with the given name.
/a Optional, can be repeated. When DILE is loaded, a new project will be created and the given assemblies will be added to it.
/l Optional. DILE will load the given dileproj file. If this parameter is given then /p and /a will be ignored. If a parameter is followed by a name/path which contains spaces then it should be written between quotes
創(chuàng)建一個Test project的項目
dile /p "Test project"
創(chuàng)建一個Test project的項目,并給它添加程序集
dile /p "Test project" /a TestAssembly.exe
創(chuàng)建一個新項目,并從兩個不同的地方加載程序集
dile /a TestAssembly.exe /a "c:\assemblies\My test.dll"
加載一個現(xiàn)有的項目
dile /l TestProject.dileproj