使用.NET反编译器的示例

4
作为一个新手程序员,我发现使用.NET Reflector是一个非常好的工具来了解“专业人士”如何编写代码。
请问有哪些好的基于.NET的桌面应用程序可以用Reflector来查看?任何应用程序示例都将不胜感激。

谁-了就是个混蛋。+'了作为对策。 - user1228
8个回答

1

我暂时想不到什么,但你可能想获取一些开源的东西并编译它。这样,如果 MSIL 令人困惑,你就有源代码可以参考。

我发现 Code Project 有很多可用于各种不同目的的好样例程序。虽然我主要用它来制作 C++ 应用程序,但我还没有研究 .NET 程序。我的猜测是它们也同样好。


1

我最常使用它的情况是当我对一段代码在文档中没有涉及到的情况下想要了解它的作用。例如,我曾经在尝试为旧版ASP.NET WebForms模型创建复杂的Web控件时进行了大量反射。整个调用堆栈非常复杂,而文档也不是很友好...

我现在使用Reflector的#1原因可能是查看一个调用可能抛出哪些异常。.net文档最大的缺陷之一是它通常只告诉你当前方法在异常方面会抛出什么。例如,如果方法A可能会抛出异常1,并且方法A调用可能会抛出异常2的方法B,那么在方法A的文档中只会告诉你关于异常1的信息。有时你甚至连ArgumentNullExceptions都不会得到。

使用反射器的最酷之处之一是我想创建DynamicMethod时。 DynamicMethods允许您通过IL调用构造方法;它介于反射(慢)和在内存中编译自己的程序集(执行速度快但启动慢)之间。 我想创建一个小类,检查测试期间是否触发了事件... 无论如何,我不知道如何编写IL代码,所以我创建了一个包含完全符合我想要在DynamicMethod中执行的操作的类的程序集,将其编译,然后在Reflector中查看IL。 那本身就是一项令人满意的练习,我可能会使用相同的技术来进行更复杂的语句解析/编译...

同样适用于IL;当然,在.NET 3.5(甚至在4.0中),Expression是一个可行的(保持理智的)替代方法,但您仍然需要反编译器来了解如何创建表达式;-p - Marc Gravell

1

在开发过程中,我使用反射器来检查编译器如何将C#转换为IL,因为我经常使用Reflection.Emit和Expression等工具。我还使用它快速查看我的代码;当你有一个大的dll库时,我发现将dll+xml从构建服务器拖到反射器中比加载每个项目到VS中更快,特别是如果我不确定代码的位置...

您还可以使用像snippy这样的插件作为代码片段的测试平台。


0

由于我们的应用程序使用了几个许可组件,我使用 Reflector 确切地查看嵌入到可执行文件中的许可证。根据我通过 Reflector 预期看到的内容,我还编写了单元测试以确保所需的许可证存在,即使在构建服务器上构建时也是如此。


0
通常我使用Reflector来回答关于效率/性能的问题。例如,我想知道在比较字符串时是最好使用==运算符还是.Equals()方法,或者这是否重要。打开Reflector中的System.String程序集,通过检查方法调用和操作,你就可以得到答案了。

0

我认为它主要适用于.NET核心和补充程序集。例如,如果你想知道Parallel.Invoke如何工作,只需打开Reflector并变得更加聪明。但要注意,mscorlib有很多P/invoke引用,由于明显的原因,您将无法反汇编。


现在我们有源代码了!http://weblogs.asp.net/scottgu/archive/2008/01/16/net-framework-library-source-code-now-available.aspx - Jon Adams
哇,我得去看看。我想知道微软是否将他们的OpenType API开源...但我有点怀疑。 - Dmitri Nesteruk

0
我使用它的主要原因是为了探索各种本质相同的 .NET 方法的效率。

0

我最近倾向于使用Reflector查找类所使用的所有接口。有时分析类在命名空间的其他部分中的使用位置以确定如何实现它也很有帮助。

如果源代码不可用,观看Reflector中的代码可能会有所帮助,但绝大多数情况下最好找到代码本身,因为这至少能让您了解代码实际上是如何编写的。因为Reflector正在查看IL,所以该代码被“优化”为计算机,而不是人类可读性。此外,如果开发人员花时间添加任何注释到代码中(我知道这很少见,但确实发生了),Reflector将不会拥有它们,因此无法从其中获取任何洞察力。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接