使用.NET Reflector 单步调试编译好的程序集

  • Dmytro Mindra
  • 臧秀涛

2012 年 10 月 11 日

话题:.NET语言 & 开发

对于没有任何源代码和PDB 文件的预编译程序集而言,如果没有合适的工具,调试起来并不容易。使用 Red Gate 的.NET Reflector可以在 Visual Studio 中即时反编译程序集,然后像调试有源代码的程序集一样单步跟踪它。

大家需要了解.NET Reflector(在 VS 和 VSPro 版本中)是可以集成到 Visual Studio 中的。标准的内置对象浏览器只显示公有方法和类(见图 1),而.NET Reflector 的对象浏览器(见图 2)可以对编译好的程序集进行更为深入的分析,可以让用户浏览内部类、方法和代码。Red Gate .NET Reflector 的 Visual Studio 插件能够进行即时反编译。要调试编译好的程序集,用户可以在解决方案浏览器窗口中右击一个程序集,并选择“Enable debugging”选项。.NET Reflector 首先会尝试定位本机上的 PDB 文件,如果没有则会自己创建 PDB 文件,然后用户就可以单步调试程序集代码、设置断点并使用常规的调试技术了(见图 4)。

(单击图片以放大)

图 1 内置的对象浏览器

(单击图片以放大)

图 2 .NET Reflector 对象浏览器

图 3 启用对编译好的程序集进行调试的支持

(单击图片以放大)

图 4 调试编译好的程序集

在 Visual Studio 中有了这种工具,在诊断第三方程序库问题上花费的时间将会大大减少。

InfoQ 记者 Jonathan Allen 写到,

“在多团队合作的项目中,我经常收到其他咨询公司发来的编译好的程序集,但是没有源代码。如果另一个团队在国内的另一头,甚至是世界的另一边,光交流可能就要花掉我一天或更多的时间。我尝试使用 Reflector 的调试器支持,并被它的表现震惊了。我能够自己诊断问题,花不了多少时间就能让测试服务器启动并运行起来。

只有两点我不太满意。首先,它不能处理 C++ CLI 程序集。碰到这种程序集时,我只能使用JetBrain 的 dotPeek。其次,在没有解决方案文件的情况下进行调试时,没有一个明确的方式可以让我打开任意程序集文件。我能够很轻松地附到一个运行的进程上,但真正要看什么时,还需要触发一个异常。然后通过异常我才能在栈中上下定位,并在实际需要的地方设置断点。”

.NET Reflector 是通过一系列插件进行支持的,而且最近Red Gate 也将流行的插件 PowerCommands(该插件由Jason Haley提供)直接集成了进去(图 5)。

图 5 PowerCommands

Red Gate .NET Reflector 是商业软件。它会定期更新以保持与新技术和新工具的同步。7 月 22 日,.NET Reflector 7.6.0.808 版本已提供下载

Sergey Barskiy,作为一个有多年 Reflector 使用经验的.NET 开发者,他写到,

“当 7.6 版本发布时,我非常激动。这个版本会提供对新技术的支持。当时微软发布了大量激动人心的产品和技术——Windows 8 和 WinRT 库、Visual Studio 2012、.NET 4.5 和带有新的异步功能的 C# 5。这些新技术 Reflector 7.6 全部都支持。”

2011 年 3 月 14 日,随着.NET Reflector 7 的发布,Red Gate 使它成为了一个商业化产品,该公司的几个竞争对手随即免费发布了他们的软件,其中包括JetBrains DotPeekTelerik JustDecompileILSpyCodeReflect

JetBrains DotPeek(见图 6)是最先进的.NET 反编译器之一。它生成的代码质量很高,它还会尝试到源代码服务器上抓取代码。DotPeek 的导航功能和快捷键非常便捷。它还能精确查找符号的使用,同时支持插件。DotPeek 不能与 Visual Studio 集成。

(单击图片以放大)

图 6 DotPeek

Telerik JustDecompile是一个免费的.NET 反编译器,但是有商业化支持。它生成的代码质量也很高。它可以为反编译程序集得到的代码创建一个项目。JustDecompile 提供了健壮的查找功能,能够支持全文查找和符号使用查找。它还有一个插件系统,目前在 Telerik 的网站上有两个可用的扩展。JustDecompile 不能与 Visual Studio 集成。

(单击图片以放大)

图 7 JustDecompile

(单击图片以放大)

图 8 JustDecompile 的查找对话框

ILSpy是唯一免费且开源的.NET 反编译器,它基于 MIT 许可证发布。ILSpy 的代码生成和语法高亮功能做的非常好。对于反编译的程序集,它既可以将其保存在一个文件中,也可以为所有文件创建一个项目。ILSpy 是一个独立的工具,没有 Visual Studio 集成。

(单击图片以放大)

图 9 ILSpy

CodeReflect相对于其他免费的或者商业的竞争产品,并没有增加什么功能。它是一个商业性维护的.NET 反编译器,特性集相对简单,没有多余的功能。它提供了非常基本的代码生成与语法高亮功能。它不能保存文件或创建项目。用户只能将它反编译生成的代码复制出来。当然它也不能与 Visual Studio 集成。

(单击图片以放大)

图 10 CodeReflect

不管用户是否愿意为 Visual Studio 集成花钱,他们总可以在市场上找到合适的免费或付费的.NET 反编译器。

查看英文原文http://www.infoq.com/news/2012/08/precompiled-net-reflector


感谢王瑜珩对本文的审校。

给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

.NET语言 & 开发