【已发表于《程序员》2007年第4期】
我想绝大多数熟悉.NET开发的朋友对于Reflector for .NET这款类浏览及反编译软件都不会感到陌生,尤其是当我们想要进一步窥探.NET框架及其它.NET程序内部细节的时候,它总是能够给我们提供非常高效有力的帮助。Reflector for .NET是利用.NET反射机制来分析程序集而实现的一款反编译及类浏览软件,它可以将采用.NET平台语言编写的可执行文件及动态链接库反编译成多种程序语言的源代码,有效地帮助开发人员了解实现细节并提高了初学者的学习效果。Reflector for .NET自2000年首次发布以来,数年来一直以短小精悍的风格赢得了广大.NET程序员们的青睐,并跻身“.NET程序员10大必备工具”之列,本文的重心在于探讨近期发布的5.0版本所带来的新特性并向初次接触的读者朋友们展示一下这款软件的基本使用方式,希望这些强大有用的功能和振奋人心的新特性能够帮助更多的程序员及编程爱好者们更好地解决技术问题。
运行Reflector for .NET主程序后我们可以看到一个相当简洁的窗口,左边是程序集的树形结构,右边主窗口则是所选择的程序节点的源代码,当然,这些代码都是.NET中间语言经反编译之后产生的。
图1,Reflector for .NET V5.0 主界面
在主界面上我们可以同时看到五个子窗口:类浏览窗口、属性窗口、反编译代码窗口、注释窗口以及分析器窗口。相对于过去的改进是现在我们可以同时看到反编译窗口以及分析器窗口,这五个窗口同时支持前进和回退按钮以及快捷键操作。如果两次从不同地方导入同一个程序集的话,Reflector将会自动更新其地址。
图2,反编译窗口
我们在反编译窗口中所看到的源代码是经过将EXE或DLL文件反编译后所得到的,因此可能跟真正的源代码有一些出入,但是并不能算作是瑕疵,这些源代码已经足够让我们了解技术细节和作者的思路了。反编译窗口是支持超链接行为的,如果您将鼠标移至类型或方法名上面,就会出现属性提示框,如果您点击这个类型或者方法名的话,浏览器将自动转向该类型或方法定义的代码片断。当然,刚才提到的这五个窗口将会保持同步。反编译窗口提供了对LINQ项目的支持,用户可以通过反编译LINQ项目生成的可执行文件或动态链接库浏览扩展方法、LINQ查询表达式以及Lambda表达式等代码。
图3,支持.NET 3.0
分析窗口可以增加/删除并同时分析多个节点,找出虚函数的所有重载方法,并可以采用“Exposed By”和“Instantiated By”两种方式查找,如果是字段的话则采用“Assigned By”方式来查找。
图4,分析窗口
注释窗口将程序块的XML格式的注释以文档的形式展现出来,让用户可以更清楚地了解代码的使用方式和注意事项。与反编译窗口一样的是,注释窗口里的内容也是支持超链接行为的,用户可以尽情地在程序里冲浪。
图5,注释窗口
新版的Reflector for .NET更是支持方便快捷的代码查找方式,您可以在IE浏览器的地址栏或是开始菜单的运行窗口中输入代码的链接地址,例如:code://mscorlib.System.Console,回车确认后Reflector for .NET会自动激活并转向Console节点,五个窗口也会同时显示该节点相应的代码信息。另外Reflector for .NET增加了在查找栏中输入字符串、常量来查找所需代码的功能,同时提供了精确查找的选项。
图6,查找
随着微软.NET的不断升级,Reflector for .NET也在不断地更新和增强,新版本提供了更多的支持。打开属性窗口您可以看到,Reflector for .NET支持了三个版本的.NET Framework,其中最新的是3.5版。既然提供了支持,那么Reflector for .NET也就可以反编译并展示LINQ项目中的各种新特性。在新版的Reflector for .NET中,我们可以看到在选项对话框中增加了对平台版本的优化功能、设置字符缩进、选择只在public节点或是在所有节点之间跳转、自动处理程序集引用以及使用16进制或是10进制显示数据等功能,极大地使用了不同用户的使用习惯和需求。
图7,选项对话框
接下来我们就自己动手来看看Reflector for .NET的使用方式吧。首先打开Visual Studio 2005创建一个C# Console项目,编写一段简短的示例代码。
1: namespace ConsoleDemo
2: {
3: public class Program
4: {
5: static void Main(string[] args)
6: {
7: Console.Write("Name: ");
8:
9: string name = Console.ReadLine();
10:
11: Console.Write("Gender(Boy/Girl): ");
12:
13: string sex = Console.ReadLine().ToLower();
14:
15: switch (sex)
16: {
17: case "boy":
18: Console.WriteLine(String.Format("\nHi, {0}, do you missing your girlfriend?", name));
19: break;
20: case "girl":
21: Console.WriteLine(String.Format("\nHi, {0}, do you like your high-heel shoe?", name));
22: break;
23: default:
24: Console.WriteLine("Gender format is error!");
25: return;
26: }
27:
28: Console.ReadLine();
29: }
30: }
31: }
这段代码其实相当简单,只要有一点点程序设计基础的朋友就可以看懂,我们编写这段代码的目的就是考验一下Reflector for .NET的反编译能力。运行这段代码并证明没有错物之后我们打开Reflector for .NET,在“File”菜单里点击“Open”按钮,在文件窗口中找到刚才运行程序所产生的ConsoleDemo.exe文件并打开,然后我们就可以在类浏览窗口里看到ConsoleDemo节点,打开ConsoleDemo.Program.Main节点,右边的反编译窗口就会显示出经过反编译后的C#代码。由此我们可以非常清楚地看到,Reflector for .NET反编译出的代码和我们编写的代码几乎没有任何差别。
图8,Reflector for .NET反编译结果
当然,在比较复杂的代码里可能经过反编译的代码和真实的源代码会有些许差异,但肯定不会影响其功能。Reflector for .NET不仅仅支持C#语言,它还支持VB.NET、Managed C++、Intermediate Language、Delphi和Chrome共六门编程语言。读者朋友们可以从网上免费获得这款强大的工具软件,好好地利用它来学习和借鉴更多更好的程序的精髓。