本文将介绍下列工具:
· 代码片段编译工具: Snippet Compiler
· 正则表达式构建工具: Regulator
· 代码生成工具: CodeSmith
· 单元测试工具: NUnit
· 代码分析与检查工具: FxCop
· .NET 程序集检查工具: .NET Reflector
· 代码文档创建工具: NDoc
· 解决方案编译工具: NAnt
· 版本切换与转换工具: ASP.NET Version Switcher 和 Visual Studio .NET Project Converter
没有好的工具,就写不出好的程
序。除了众所周知的工具(例如,
Visual Studio? .NET
)以外,
.NET
社区里还有许多声名未广的小工具。本文将简单介绍一些很好的针对
.NET
开发的免费工具及其使用方
法,它们有的会从方方面面节省你编程的时间,有的则可能会彻底改变你编写代码的方式。由于在一篇文章中谈及这么多工具,所以我无法作全面的介绍,但你应当
充分了解它们,确定哪些对你的项目有用。
Snippet Compiler
Snippet Compiler
是一个基于
Windows?
的小应用程序,利用它能够编写、编译和运行
. NET
代码。如果你有小段代码需要
测试而又不想专门为它专门创建完整的
Visual Studio .NET
项目时,这个工具很有用。
例如,我要向你展示如何从 Microsoft? .NET Framework 调出 Notepad 应用程序,代码片段如下:
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName= "notepad.exe";
proc.Start();
proc.WaitForExit();
我可以在 Snippet Compiler 中新建一个默认的控制台应用程序(译注:代码框架已生成),然后在它的 Main 方法中写入代码片段,如图 1 所示。
图 1 Snippet Compiler
要测试这段代码,只需按工具条上的 start 按钮(绿色三角),它就会运行 在调试方式下。该段代码产生一个控制台窗口,然后调出 Notepad 。关闭 Notepad ,控制台窗口也随之关闭。
我发现为求助者编写小例程时, Snippet Compiler 非常有用。通常,我必须先创建一个项目,保证所有代码编译成功后,把代码片段发给求助者,然后再删除项目。有了 Snippet Compiler ,这个过程就很容易。
Snippet Compiler 由 Jeff Key 编写,可以从这里下载: http://www.sliver.com/dotnet/SnippetCompiler 。
[ 以下内容为译者补充,摘自: http://royo.is-a-geek.com/regulator ]
Snippet Compiler 主要功能:
- 编译和运行一个或多个 C# 、 VB.NET 和 ASP.NET 代码片段
- 可选择编译 WinForm EXE 文件、控制台 EXE 文件或 DLL 文件
- 用户可存储模板库
- 显示编译错误和警告,包括在编辑器中以波浪线提示
- 智能感应( IntelliSense )静态成员、方法及构造器签名
- 导入 VS.NET 项目
- 可方便置入任务栏通知区
- 将代码片段导出为 HTML 文件或 RTF 文件
=======================================================================
Regulator
Regulator是 最近才加入到我的必备工具列表中的。它是一个功能全面、易于使用的正则表达式构建和测试工具。正则表达式定义了基于字 符、字符出现频率和字符顺序的字符串匹配模式,通常用于验证用户输入或在长字符串中进行子串查找,例如,在网页上查找 URL 或 e-mail 地址。
你可以在 Regulator 中输入一条正则表达式和一些测试内容(或打开文件),利用它来测试正则表达式的匹配结果,如图 2 所示。
图 2 Regulator
文档窗口中包含的是一条简单的正则表达 式 [0-9]* ,右下角是测试输入,左下角则显示正则表达式的匹配结果。像这样在独立的应用程序中编写和测试正则表达式要比在自己的程 序中作起来容易得多。
Regulator 最好的功能之一是能够搜索 regexlib.com 站点的在线正则表达式 库。例如,如果在搜索框中输入字符串“ phone ”,就会找到各种电话号码的正则表达式匹配结果。
Regulator 由 Roy Osherove 编写,下载网址: http://royo.is-a-geek.com/regulator 。
[ 以下内容为译者补充,摘自: http://royo.is-a-geek.com/regulator ]
Regulator 主要功能
正则表达式操作 支持
支持三种最通用的正则表达式操作:
- 查找多个匹配
- 按表达式替换文本
- 按表达式拆分文本
- 从 RegexLib.com 数据库搜索和导入表达式及示
- 使用图形化 向导将用户自己的正则表达式提交到 RegexLib.com 数据库
- 支持代理服务器
文本编辑
- 句法显亮
- 多文档选项卡界面
- “快速添加”功能允许用户轻松选择要插入的句法操作
- “快速添加”菜单项完全可定制,只需简单地修改程序目录中相关的配置文件
- 支持括号匹配
- 使选定的文本“转义”到特定的字符串而无需手工输入 /s 、 /n 以及其它转义字符
- 折合和打开选择:可创建折叠区域以便于易读
- 在编辑器中仅选择表达式的一部分对其执行匹配和替换
性能分析
- 图形化显示匹配和替换操作的时间表图,便于观察优化效果
- 精确显示匹配和替换操作用时
文本片段工具
- 简单易用的常用文本片段工具条,方便表达式键入
- 文本片段工具条完全可定制,任何文本片段均可编辑或删除,或者可以只添加用户自己的文本片段
- 插入的包含“ <> ”符号的文本片段将自动在文本编辑器选中,允许你编写节省键入时间的范型片段
常用功能
- 多线程操作: 能取消长时间运 行的表达式匹配和替换 操作
- 可最小化到系统托盘
- “最近打开文件”菜单
- 其它小功能
=====================================================================================
创建定制模板
<%@ CodeTemplate Language="C#"
??
TargetLanguage="C#"
??
Description="Car Template" %>
<%@ Property Name="ClassName" Type="String" Category="Context"
????
Description="Class Name" %>
NUnit
Nunit 是一个为 .NET Framework 建立 的开源单元测试框架。 Nunit 允许在代码中 编写测试程序来测试应用程序特定的功能。单元测试是一种优秀的测试代码功能性的方法,它也为应用程序提供了一种回归测 试方法。 NUnit 为编写单元测试提供一个框架并提供图形化界面运行测试和查看结果。
编写 Nunit 测试
例如,我想测试 .NET Framework 中 Hashtable 类的功能性以确定两个对 象是否可以添加到 Hashtable 中并进行检索。首先,我要添加对 NUnit.Framework 程序集的引用,以便能够访问 Nunit Framework 的特性和方法。接下来,创建一个类并以 TestFixture 特性标记。这个特性让 NUnit 知 道该类包含 NUnit 测试:
using System;
using System.Collections;
using NUnit.Framework;
namespace NUnitExample
{
[TestFixture]
public class HashtableTest {
public HashtableTest() {
}
}
}
再创建一个方法并以 [Test] 特性标记,以便让 NUnit 知道该方法是一个测试。然后,建立一个 Hashtable 并添加两个值,最后使用 Assert.AreEqual 方法来查看是否能够检索到相同的值添加到了 Hashtable 中,代码如下所示:
[Test]
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!");
}
以上测试虽然简单,但能够展示出 NUnit 的功能。 NUnit 中有许多测试类型和各种 Assert 方法,可用于测试代码的每个部分。
要运行该测试,需要创建一个项目,在 NUnit 中打开已生成的程序集,然后点击“ Run ”按钮,运行结果如图 5 所示。
图 5 NUnit 测试运行结果
当看到绿色的状态条,我感觉很兴奋也 很亲切,因为它表明测试通过了。这个简单的例子展示了 NUnit 的易用性和强大的功能。编写可以保存并且无论何时改变代码都 能重新运行的单元测试不仅使得检测代码缺陷更为容易,而且让你能够交付更好的应用程序。
NUnit 是一个开源项目,下载网址: http://www.nunit.org/ 。还有一个很好的 NUnit Visual Studio .NET 插件,它能让你直接从 Visual Studio 运行单元测试。这个插件可以在 http://sourceforge.net/projects/nunitaddin 找到。要了解更多有关 NUnit 的信息以及它在测试驱动开发中的应用,可阅读 2004 年 4 月 MSDN? 杂志中的文章《 C# 测试驱动开发:利用极限编程技术改进项目设计和灵活性》。
FxCop
.NET Framework 的功能非常强大,这意味着创建优秀应用程序的潜力巨大,但也同样存在创建出糟糕程序的机会。 FxCop 是一个帮助你创建更好应用程序的工具,它使你能够检查程序集并检验它对一些不同规则的遵从性。 FxCop 带有一套微软公司创建的规则,但你也可以创建和包括自己的规则。例如,如果你决定所有的类都应当有一 个缺省的不带参数的构造器,那你可以写一条规则检查程序集每个类的构造器。通过这种方式,不论谁来编写代码,都会有确定的一致性。如果你想了解更多有关创 建定制规则的信息,可以阅读 2004 年 6 月 MSDN 杂志的代码杀手专栏中 John Robbins 有关这个主题的文章《遇到糟糕代码? FxCop相 助》( Bugslayer : Bad Code? FxCop to the Rescue )。
那么,让我们利用 FxCop 对前面使用的 NUnitExample 程序集进 行检查,看看会有什么错误。打开 FxCop 后,首先要创建一个 FxCop 项 目,然后加入想要测试的程序集,按下“ Analyze ”按钮, FxCop 就会执行检查。在 NUnitExample 程序集中发现的错误和警告如图 6 所示。
图 6 FxCop 检查结果
FxCop 发现了我的程序集存在几个问题。可以通过双击错误查看详细内容,包括规则描述以及在哪里可以找到更 多信息。(你可以用 FxCop 检查一下 .NET Framework 的程 序集,看看结果如何。)
FxCop 能帮助你创建一致性更好的代码,但它 不能弥补糟糕的应用程序设计或编程。 FxCop 也不是一个代码复查的替代工具,但是它能在代码复查之前捕获大量错误,所以你可以将更多时间用在重点问题 上而不是去为命名惯例去操心。
FxCop 由微软公司开发,下载网址: http://www.gotdotnet.com/team/fxcop 。
===============================================================================================
.NET Reflector
.NET Reflector 是一个类浏览器和反编译器,它能够检查程序集并显示其 所有信息。 .NET Framework 引入了反射的概念,利用反射可以检查任何基于 .NET 的代码,无论是单个的类还是完整的程序集。反射还可用于检索特定程序集中有关各种类、方法和属性的 信息。使用 .NET Reflector 可以浏览程序集的类和方法,可以检查这些类和方法生成的微软中间语言( MSIL ),可以反编译类和方法,还可以查看等效的 C# 或 Visual Basic? .NET 代码。
为了加以说明,我把前面的 NUnitExample 程序集加载到 .NET Reflector 中进行查看,如图 7 所示。
图 7 利用 .NET Reflecto 查看 NUnitExample 程序集
.NET Reflector 带有 多种工具,你可以进一步检查这个程序集。如果要查看组成方法的 MSIL ,可以右键点击方法,然后 从弹出菜单选择“ Disassembler ”。
除了查看 MSIL , 你还可以通过选择工具菜单下的 Decompiler 查看方法的 C# 代码。也可以通过选择语言菜单 查看方法反编译后的 Visual Basic .NET 或 Delphi 代码。下面就是 NET Reflector 产生 的 C# 代码:
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 Framework 程序集和方法。 .NET Framework 提 供很多途径来执行类似的操作。例如,如果要从 XML 读数据集,可以使用 XmlDocument 、 XpathNavigator 或 XmlReader 等各种不同方法。使用 .NET Reflector ,你可以查看 Microsoft 公司怎样编写 DataSet 的 ReadXml 方法,或如何从配置文件读取 数据。 .NET Reflector 对于查看 HttpHandler 或 configuration handler 等对象的创建也是一个很好的途径,因为你可以看看 Microsoft 开发组在 .NET Framework 中是如何实际构建这些对象的。
.NET Reflector 由 Lutz Roeder 编写,下载网址: http://www.aisto.com/roeder/dotnet 。
[ 译注:在新版本 4.0.10.0 中,界面或操作稍有不同 ]
==========================================================================================
NDoc
编写代码文档一直是一项令人生畏的任务。这里我并不是指设计 初期的文档或更为详细的设计文档,而是指类中方法和属性的文档。 NDoc 工具能使用反射检查程序集 并使用从 C# XML 注释生成的 XML 文档自动为你的代码生成文 档。目前只有 C# 提供 XML 注释,但利用 Visual Studio .NET 小 工具VB Commenter 可 以使 Visual Basic .NET 具有 XML 注释功能。另外, Visual Studio 的下一个发布版本将对更多的语言支持 XML 注 释。
///
/// This test adds a number of values to the Hashtable collection
/// and then retrieves those values and checks if they match.
///
[Test]
public void HashtableAddTest()
{
//Method Body Here
}
This test adds a number of values to the Hashtable collection
and then retrieves those values and checks if they match.
NDoc 利用反射查看程序集,然后 读取文档中的 XML 并进行匹配。 NDoc 可使用该数据创建各种不 同的文档格式,包括MSDN 风格的 HTML 帮助文件格式( .chm )、 Visual Studio .NET 帮助 文件格式( HTML Help 2 )等 。生成 XML 文件之后,下一步是将程序集和 XML 文 件加载到 NDoc 中以便进行处理。操作很简单,只需打开 NDoc 并 点击“ Add ”按钮,然后添加相关文件即可。
一旦程序集和 XML 文 件载入 NDoc 中并根据属性范围定制输出后,点击“ Generate ”按钮就开始生成文档。使用默认属性, NDoc 会生成一些非常有用的 .html 和 .chm 文件,因而以快速和有效的方式自动 完成了烦人的任务。
NAnt
NAnt 不 像目前版本的 Visual Studio .NET ,它是一个基于 .NET 的编译( Build )工具,能够使项目的编译过程非常容易。当项目开发者很多时,不可能依靠某个人去执行编译过程,你也 不想经常去手工编译项目,而是代之以创建一个每天晚上自动运行的编译过程。 NAnt 允许你执行编译解决方案、复制文件、运行 NUnit 测试、发送 e-mail 等工作。遗憾的是, Nant 没有漂亮的图形化界面,但它包括一个控制台应用程序和 XML 文件, XML 文件指定了编译过程中应当完成的任务。注意 Visual Studio 2005 新的编译平 台 MSBuild ,它提 供非常稳健的编译功能并且同样是由基于 XML 的项目文件驱动的。
使用 NAnt
在这个例子中,我将为前面创建的 NUnitExample 解决方案创建一个 NAnt 编译文件。首先创建一个以 .build 为扩展名的 XML 文件,将它置于项目的根目录下,然后在文件 顶部添加一个 XML 声 明。第一个添加的标记是项目标记:
The NUnit Example Project
项目标记设置了项目名称、缺省目标和基目录。描述标记设置了该项目的简要描述。
接下来是添加属性标记,用于存储可从 文件任何地方访问的设置值。在本例中,我要创建一个名为 debug 的属性,它可以设置为 true 或 false ,用于决定项目是否在调试时被编译(这个特殊的属性最后实 际上不影响项目的编译,它是你设置的一个简单变量,可以在实际决定如何编译项目后读取。)属性标记如下:
然后,创建一个目标标记。一个项目可以包含多个标记,它们在 NAnt 运行时指定。如果没有指定目标,则使用项目元素中缺省的设置 值。在本例中,缺省目标是“ build ”。让我们看一看目标元素,它包含大部分编译信息:
在目标元素中,我设置了要编译的目标名并创建一个任务描述。 下面还要创建一个 csc 元素,它指定应当传递给 C# 编译器 csc 的内容。让我们看一看 csc 元素:
debug="${debug}">
首先,必 须设置 csc 元素的目标。在本例中我将创建一个 .dll 文 件,因此我将目标设置为“ library ”。接下来设置 csc 元 素的输出,它指定 .dll 文件的创建位置。最后,需要设置 debug 属 性,它决定项目是否在调试时被编译。因为前面已经创建了一个属性来存储这个值,所以可以使用下列字符串来访问该属性的值: ${debug} 。 csc 元素还包含一些子元素,这里需要创建 两个元素:引用元素告知 NAnt 需要为这个项目引用的程序集,源文件元素告诉 NAnt 编 译所包括的文件。在本例中,我引用 NUnit.Framework.dll 程序集并包括 HashtableTest.cs 文 件。最终的编译文件见图 8 。(正常情况下你还应当创建一个用于删除生成的文件的 clean 目标,但我为了文章简短而省略了。)
图 8 NAnt 编译文件
要编译这个文件,需要在 .build 文件所在的项目根目录下执行 NAnt.exe 。如果编译成功,应用程序的 bin 目录下可以找到 .dll 和 .pdb 文件。尽管使用 NAnt 确实不如在 Visual Studio 中点击“ Build ”那么容易,但对于开发 按进度自动运行的编译过程,它是一个功能非常强大的工具。 NAnt 还包括一些有用的功能,例如,运行 单元测试或复制其它文件(目前的 Visual Studio 编译过程不支持这些功能)。
NAnt 是一个开源项目,下载网址: http://NAnt.sourceforge.net/ 。
=========================================================================================================
版 本切换和转换工具
在这一部分,我将介绍两个版本切换和转换工具,它们虽然简 单,但极为有用。第一个工具是 ASP.NET Version Switcher ,它可以切换虚拟目录运行下的 ASP.NET 版本。第二个工具是 Visual Studio Converter ,它可以将项目文件在 Visual Studio .NET 2002 和 Visual Studio .NET 2003 之 间转换。
当 IIS 处理请求时,先查看被请求文件的扩展名,然后基于 Web 站点或虚拟目录的扩展名映射,或者将请求委托给 ISAPI 扩展处理,或者由自己处理。这就是 ASP.NET 的工作原理,扩展名映射注册了所 有的 ASP.NET 扩展 名并将它们指引到 aspnet_isapi.dll 。这不会有什么问题,但如果你安装了 ASP.NET 1.1 ,会将扩展名映射升级到新版本的 aspnet_isapi.dll ,当建立在 ASP.NET 1.0 上的应用程序试图运行在 版本 1.1 时,就会引起 错误。为了修正这个问题,你可以将所有扩展名映射切换回 1.0 版本的 aspnet_isapi.dll ,但手工切换 18 个扩展名映射可不是一件有趣的事。这时, ASP.NET Version Switcher 就有了用武之地。它可以切换任何单个 ASP.NET 应用程序使用的 .NET Framework 版本。
ASP.NET Version Switcher 如图 9 所示。使用时,只需简单地选择应用程序,然后选择应用程序想要使用的 .NET Framework 版本。按下切换按钮, 它就会使用 aspnet_regiis.exe 命令行工具将应用程序切换到所选择的 .NET Framework 版本。当 ASP.NET 和 .NET Framework 未来版本发布后,这个 工具会更为有用。
图 9 ASP.NET Version Switcher
ASP.NET Version Switcher 由 Denis Bauer 编写,下载网址: http://www.denisbauer.com/NETTools/ASPNETVersionSwitcher.aspx 。
Visual Studio .NET Project Converter (见图 10 )非常类似于 ASP.NET Version Switcher , 它用于转换 Visual Studio 项目文件的版本。尽管 .NET Framework 版本 1.0 和 1.1 仅小有不同,但项目文件一旦从 Visual Studio .NET 2002 转换到 Visual Studio .NET 2003 , 就再转换不回来了。虽然大多数情况下这可能不是一个问题(因为 .NET Framework 版本 1.0 和 1.1 之间没有大的变化),但有时候你可能需要将项目转换回来。这个转换器可以将任何解决方案或项目文件从 Visual Studio 7.1 ( Visual Studio .NET 2003 ) 转换到 Visual Studio 7.0 ( Visual Studio .NET 2002 ),如果需要还可以转换回来。
图 10 Visual Studio .NET Project Converter
Visual Studio .NET Project Converter 由 Dacris Software 公司编写,下载网 址: http://www.codeproject.com/macro/vsconvert.asp 。
[ 译注:该工具目前提供 2.0 版本,但使用过程中存在问题。 另,作者提供源代码,可供修改、学习和参考。 ]
结语
对这些工具走马观花的介绍结束了,但我已经尽力展现了足够的 信息以激发你的兴趣。我相信这篇文章让你了解了一些可以立即开始使用以写出更好项目的免费工具。我也力促你确保拥有其它合适的工具,无论是最新版本的 Visual Studio ,一台功能强大的计算 机,还是一个免费工具。拥有合适工具,一切都将不同。
--------------------------------------------------------------------------------
[ 作者简介 ] James Avery, .NET 与 Microsoft 技术顾问,出版过多部书籍并 发表过很多文章,最新著作为《 ASP.NET Setup and Configuration Pocket Reference 》( Microsoft 出版社, 2003 )。 e-mail : javery@infozerk.com , weblog : http://www.dotavery.com/blog 。