Dotnet IL Editor是一款.NET平臺(tái)反編譯工具,可以反編譯.NET程序集文件為IL代碼,并且可以執(zhí)行,調(diào)試反編譯后生成的IL代碼。它的設(shè)計(jì)出發(fā)點(diǎn)比較直觀,新建一個(gè)項(xiàng)目,添加程序集文件,設(shè)置斷點(diǎn)(F9),然后就可以調(diào)試反編譯后的程序集文件,Step Into,Step Out均可,以此原理,可以找到系統(tǒng)的瓶頸代碼,也可以深入的學(xué)習(xí)MSIL微軟中間語(yǔ)言。
調(diào)試IL代碼:
IL Editor的調(diào)試功能是它的亮點(diǎn)之一,可以在打開(kāi)的IL代碼中直接設(shè)置斷點(diǎn)(F9, Toogle breakpoint),然后點(diǎn)擊工具欄中的Run,啟動(dòng)調(diào)試。調(diào)試程序的幾個(gè)要點(diǎn),看堆棧Stack, 看變量值Watch,IL Editor都可以做到。
IL堆棧窗口
IL參數(shù)窗口,可顯示當(dāng)前被調(diào)用的方法的傳入?yún)?shù)
IL Watch窗口
表達(dá)式可以支持自定義的表達(dá)式,這個(gè)功能與VS中的即時(shí)窗口類(lèi)似,輸入表量或表達(dá)式,右邊計(jì)算出結(jié)果。
IL Editor的作者列舉出了一些經(jīng)過(guò)測(cè)試,演示的表達(dá)式代碼,他們是
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會(huì)對(duì)表達(dá)式求值,返回結(jié)果顯示到右邊。
最后看到執(zhí)行結(jié)果
控制上顯示輸出值,與在VS中調(diào)試C#源代碼的體驗(yàn)完全相同。
學(xué)習(xí)IL指令集
IL Editor的作者肯定想到IL語(yǔ)言不容易記住和熟悉,當(dāng)你在IL Editor中移動(dòng)鼠標(biāo)時(shí),隨著鼠標(biāo)當(dāng)前行顯示的IL代碼的不同,在IL Instructions窗口中,會(huì)及時(shí)的顯示它的方法注釋?zhuān)@示MSDN地址,可以直接點(diǎn)擊進(jìn)入該IL方法的文檔。
設(shè)計(jì)的非常貼心周到。
Click here直接挑到MSDN網(wǎng)頁(yè)中。
http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.Nop.aspx
對(duì)于我們習(xí)慣的語(yǔ)言來(lái)說(shuō),還沒(méi)有看到有相關(guān)的設(shè)置,可以用來(lái)設(shè)置跳轉(zhuǎn)到中文版的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)建一個(gè)Test project的項(xiàng)目
dile /p "Test project"
創(chuàng)建一個(gè)Test project的項(xiàng)目,并給它添加程序集
dile /p "Test project" /a TestAssembly.exe
創(chuàng)建一個(gè)新項(xiàng)目,并從兩個(gè)不同的地方加載程序集
dile /a TestAssembly.exe /a "c:\assemblies\My test.dll"
加載一個(gè)現(xiàn)有的項(xiàng)目
dile /l TestProject.dileproj