dnSpy應該是目前使用最多的.net反編譯工具。很多情況下反編譯C#代碼非常方便,特別是查找基類,子類。搜索一些class,方法。接口,非常方便。比ILspy好很多。而且dnspy是可以配置的。
如果要dnSpy非常干凈地顯示反編譯之后的代碼,可以看我具體的配置:
第一張是效果圖,過濾一個具體的關鍵詞篩選的時候可以使用【全詞匹配】,可以在所有的.net framework中查找你需要尋找的那個關鍵字,不區分大小寫。
右側底部的這個搜索框是可以配置的,而且有時候很容易被隱藏掉,需要“上拉”才能顯示出來。隱藏得比較深。
第二張圖:常規情況下,默認sndpy反編譯出來會有很多垃圾注釋。紅色框部分都是我們不需要的,會干擾我們分析代碼。如何去掉這些注釋的干擾,請看第三張圖。
第三張圖:菜單導航欄 -> 視圖 ->選項 ; 反編譯器 -> C# || IL 設置如下即可。有時候為了查看表達式樹的內部結構,我們一般不勾選 Expression Tree。查看ExpressionTree內部結構圖,圖4那樣。
第四張圖:默認情況下ILSpy要查看表達式目錄樹的內部實現,是看不到的,需要切換C#版本號,而dnspy更加簡潔。直接取消掉ExpressionTree上面勾選即可。
取消對ExpressionTree的反編譯,就是上面取消勾選“ExpressionTree”就是下面這種:
勾選 反編譯 ExpressionTree 之后,效果如下,看到的是表達式目錄樹原始的樣子:Expression<Func<People, bool>> lambda = (People x) => x.Id.ToString().Equals("5");
大家可以測試一下。
第五張圖:一個經常需要用到的工具,就是查看某個類的子類。比如MVC5中的Action返回結構經常是ViewResult(); 除了這個返回值之外,它其實還可以返回所有基於ActionResult的子類。
還一個功能就是 重新加載所有程序集。其實dnspy是有這個功能的。
通過以上對dnspy的配置,基本上可以替代我們日常的反編譯工具了。
唯一需要注意的是,exe文件被dnspy打開之后,就是獨占的狀態,會導致visual studio 2017無法重新編譯生成exe。
需要退出dnspy才行。
另外,經常看見博客園中有人丟出一些類圖。分析開源項目的框架,繼承的一些關系。
比如像這種:
結合這種dnspy的反編譯工具,把.net framework的類庫摸一個dll反編譯出 .sln 的解決方案文件,就可以用vs2017自帶的組件“體系結構和分析工具”,
右鍵解決方案中“項目”——“在代碼圖中顯示”,就可以像上面那樣子去深度分析和實踐面向對象程序設計了。理解別人的代碼的底層實現和設計原理,會有比較大的幫助。