使用.NET Reflector的示例

时间:2009-01-02 22:18:26

标签: c# .net

作为一名不熟悉.NET和C#的程序员,我发现使用.NET Reflector是一个令人难以置信的实用程序,用于查看“专业人员”如何编写代码。

任何人都可以建议使用基于.NET的应用程序将Reflector用于桌面应用程序 - 任何应用程序示例都将受到赞赏。

8 个答案:

答案 0 :(得分:1)

想不出任何副手,但你可能想要抓住一些开源的东西并编译它。这样,如果MSIL变得混乱,您将有源参考。

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

答案 1 :(得分:1)

当我对在文档未涵盖的情况下代码的作用有疑问时,我经常使用它。例如,我曾经在第一次尝试为旧的ASP.NET webforms模型创建复杂的Web控件时反映A LOT。整个callstack非常复杂,文档也不是最友好的......

我现在使用反射器的第一个原因可能是看看调用可能引发的异常。 .net文档最大的缺点之一是它通常只告诉你当前方法抛出异常的方式。例如,如果方法A可能抛出异常1,而方法A调用可能抛出异常2的方法B,则只会告诉方法A的文档中的异常1.有时您甚至不会使用ArgumentNullExceptions。

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

答案 2 :(得分:1)

我在开发期间使用反射器来检查编译器如何将C#转换为IL,因为我使用Reflection.Emit和Expression等工作做了很多工作。我也用它来快速查看我的代码;当你有一个大的dll库时,我发现将dll + xml从构建服务器拖到反射器中比将每个项目加载到VS更快,特别是如果我不是100%确定哪里有一些代码是...

您还可以使用snippy之类的插件作为代码段的测试工具。

答案 3 :(得分:0)

我通常使用Reflector来获得基于效率/性能的问题的答案。例如,我想知道在比较字符串时是否最好使用==运算符或.Equals()......或者它是否重要。破解Reflector中的System.String程序集,您将通过检查发生的方法调用和操作来获得答案。

答案 4 :(得分:0)

我认为它主要用于.NET核心和补充程序集。例如,如果您想知道Parallel.Invoke如何工作,只需弹出反射器并成为一个小工具。但请注意,mscorlib有很多P / invoke引用,由于显而易见的原因,您将无法进行反汇编。

答案 5 :(得分:0)

我使用它的主要原因是探索各种基本上做同样事情的.NDT方法的效率。

答案 6 :(得分:0)

我倾向于最近使用Reflector找到一个类都使用的接口。有时,分析在命名空间的其他部分中使用类的位置以及如何实现它是有帮助的。

如果源代码不可用,查看Reflector中的代码可能会有所帮助,但绝大多数时候最好找到代码本身,因为这至少可以让您了解代码是如何实际编写的。因为Reflector正在查看IL,所以代码是针对计算机“优化”的,而不是人类的可读性。此外,如果开发人员花时间在代码中添加任何注释(我知道它很少见,但它确实发生了)反射器将没有那些,所以任何能够从他们那里收集到的洞察力都不会存在。

答案 7 :(得分:0)

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