fxcop
.net 框架非常强大,这意味着存在创建优秀应用程序的极大可能,但是也同样存在创建劣质程序的可能。fxcop 是有助于创建更好的应用程序的工具之一,它所采用的方法是:使您能够分析程序集,并使用一些不同的规则来检查它是否符合这些规则。fxcop 随附了由 microsoft 创建的固定数量的规则,但您也可以创建并包括您自己的规则。例如,如果您决定所有的类都应该具有一个不带任何参数的默认构造函数,则可以编写一条规则,以 确保程序集的每个类上都具有一个构造函数。这样,无论是谁编写该代码,您都将获得一定程度的一致性。如果您需要有关创建自定义规则的详细信息,请参阅 john robbins 的有关该主题的 bugslayer 专栏文章(msdn ? magazine 2004 年 6 月刊)。
那 么,让我们观察一下实际运行的 fxcop,并且看一下它在我一直在处理的 nunitexample 程序集中找到哪些错误。当您打开 fxcop 时,您首先需要创建一个 fxcop 项目,然后向其添加您要测试的程序集。在将该程序集添加到项目以后,就可以按 analyze,fxcop 将分析该程序集。图 6 中显示了在该程序集中找到的错误和警告。
fxcop 在我的程序集中找到了几个问题。您可以双击某个错误以查看详细信息,包括规则说明以及在哪里可以找到更多信息。(您可以做的一件有趣的事情是在框架程序集上运行 fxcop 并查看发生了什么事情。)
fxcop 可以帮助您创建更好的、更一致的代码,但它无法补偿低劣的应用程序设计或非常简单拙劣的编程。fxcop 也不能替代对等代码检查,但是因为它可以在进行代码检查之前捕获大量错误,所以您可以花费更多时间来解决严重的问题,而不必担心命名约定。fxcop 由 microsoft 开发,并且可以从 http://www.gotdotnet.com/team/fxcop 下载。
返回页首
lutz roeder 的 .net reflector
下 一个必不可少的工具称为 .net reflector,它是一个类浏览器和反编译器,可以分析程序集并向您展示它的所有秘密。.net 框架向全世界引入了可用来分析任何基于 .net 的代码(无论它是单个类还是完整的程序集)的反射概念。反射还可以用来检索有关特定程序集中包含的各种类、方法和属性的信息。使用 .net reflector,您可以浏览程序集的类和方法,可以分析由这些类和方法生成的 microsoft 中间语言 (msil),并且可以反编译这些类和方法并查看 c# 或 visual basic ?.net 中的等价类和方法。
为了演示 .net reflector 的工作方式,我将加载和分析前面已经显示的 nunitexample 程序集。图 7 显示了 .net reflector 中加载的该程序集。

图 7 nunitexample 程序集
在 .net reflector 内部,有各种可用来进一步分析该程序集的工具。要查看构成某个方法的 msil,请单击该方法并从菜单中选择 disassembler。
除 了能够查看 msil 以外,您还可以通过选择 tools 菜单下的 decompiler 来查看该方法的 c# 形式。通过在 languages 菜单下更改您的选择,您还可以查看该方法被反编译到 visual basic .net 或 delphi 以后的形式。以下为 .net reflector 生成的代码:
public void hashtableaddtest(){ hashtable hashtable1; hashtable1 = new hashtable(); hashtable1.add("key1", "value1"); hashtable1.add("key2", "value2"); assert.areequal("value1", hashtable1["key1"], "wrong object returned!"); assert.areequal("value2", hashtable1["key2"], "wrong object returned!");}
前面的代码看起来非常像我为该方法实际编写的代码。以下为该程序集中的实际代码:
public void hashtableaddtest(){ hashtable ht = new hashtable(); ht.add("key1", "value1"); ht.add("key2", "value2"); assert.areequal("value1", ht["key1"], "wrong object returned!"); assert.areequal("value2", ht["key2"], "wrong object returned!");}
尽管上述代码中存在一些小的差异,但它们在功能上是完全相同的。
虽然该示例是一种显示实际代码与反编译代码之间对比的好 方法,但在我看来,它并不代表 .net reflector 所具有的最佳用途 — 分析 .net 框架程序集和方法。.net 框架提供了许多执行类似操作的不同方法。例如,如果您需要从 xml 中读取一组数据,则存在多种使用 xmldocument、xpathnavigator 或 xmlreader 完成该工作的不同方法。通过使用 .net reflector,您可以查看 microsoft 在编写数据集的 readxml 方法时使用了什么,或者查看他们在从配置文件读取数据时做了哪些工作。.net reflector 还是一个了解以下最佳实施策略的优秀方法:创建诸如 httphandlers 或配置处理程序之类的对象,因为您可以了解到 microsoft 工作组实际上是如何在框架中生成这些对象的。
.net reflector 由 lutz roeder 编写,并且可以从 http://www.aisto.com/roeder/dotnet 下载。