分类: C/C++
2008-08-01 17:04:07
本文使用了以下技术:.NET,C#,Visual Basic .NET,Visual Studio .NET
除非你使用可获得的最好的工具,否则别指望能生成一流的应用程序。除了 Visual Studio .NET 这种大型工具以外,你从
.NET 社区还可以获得许多小型的、不太为人所知的工具。我在本文中将向你介绍几个目前可以获得的、面向 .NET
开发的最好的免费工具。我将引领你完成一个有关如何使用每种工具的快速教程——
有些工具在许多场合可以节约你的时间,而另一些工具则可能完全改变你编写代码的方式。因为我要在本篇文章中介绍如此之多的不同工具,所以我无法详尽讨论其中每种工具,但你应该充分了解每种工具的信息,以便决定哪些工具对你的项目有用。
Snippet Compiler
Snippet Compiler 是一个基于 Windows
的小型应用程序,你可以通过它来编写、编译和运行代码。如果你具有较小的代码段,并且你不想创建完整的 Visual Studio .NET
项目(以及该项目附带的所有文件),则该工具会很有用。
例如,假设我希望向你示范如何从 Microsoft .NET 框架中启动另一个应用程序。在 Snippet Compiler
中,我将通过新建一个能够创建小型控制台应用程序的文件开始。可以在该控制台应用程序的 Main
方法内部创建代码片段,而这正是我要在这里做的事情。下面的代码片段演示了如何从 .NET 框架中创建记事本实例:
System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.StartInfo.FileName= "notepad.exe"; proc.Start(); proc.WaitForExit();
当然该代码片段本身无法编译,而这正是 Snippet Compiler 的用武之地。Figure 1 显示了 Snippet
Compiler 中的这一代码示例。
Figure 1 Snippet Compiler 运行画面
为了测试该代码片段,只须按
play(运行)按钮(绿色三角形),它就会在调试模式下运行。该代码片段将生成一个弹出式控制台应用程序,并且将显示记事本。当你关闭记事本时,该控制台应用程序也将关闭。
就我个人而言,我是在尝试为某位有求于我的人士创建一个小型示例时,才发现 Snippet Compiler
是个无价之宝——如果不使用该工具,那么我通常必须新建一个项目,确保每个部分都能编译通过,然后将代码片段发送给求助者,最后删除该项目。Snippet
Compiler 使得这一过程变得更容易、更爽快。
Snippet Compiler 由 Jeff Key 编写,下载地址是:
Regulator
Regulator 是最近添加到我的头等工具清单中的。它是一种很有特色的工具,能够使生成和测试正则表达式变得很容易。由于正则表达式在 .NET
框架中受到极好的支持,因而人们对正则表达式重新产生了兴趣。正则表达式用来基于字符、频率和字符顺序定义字符串中的模式。它们最常见的用途是作为验证用户输入有效性的手段或者作为在较大字符串中查找字符串的方法——例如,在
Web 页上查找 URL 或电子邮件地址。
Regulator
允许你输入一个正则表达式以及一些针对其运行该表达式的输入。这样,在应用程序中实现该正则表达式之前,你便可以了解它将产生什么效果以及它将返回哪些种类的匹配项。Figure
2 显示了带有简单正则表达式的 Regulator。
Figure 2 Regulator 运行画面
文档中包含该正则表达式——在该示例中,它是
[0-9]*,应该匹配一行中任意数量的数字。右下侧的框中含有针对该正则表达式的输入,而左下侧的框显示了该正则表达式在输入内容中找到的匹配项。象这样在单独应用程序中编写和测试正则表达式,要比尝试在你自己应用程序中处理它们容易得多。
Regulator 中的最佳功能之一——是能够在 regexlib.com
搜索在线正则表达式库。例如,如果你在搜索框中输入字符串“phone”,你将找到 20
种多种不同的能够匹配各种电话号码的正则表达式,包括用于英国、澳大利亚的表达式以及其它许多电话号码。Regulator 由 Roy Osherove
编写,下载地址是:
CodeSmith
CodeSmith 是一种基于模板的代码生成工具,它使用类似于 ASP.NET
的语法来生成任意类型的代码或文本。与其它许多代码生成工具不同,CodeSmith 不要求你订阅特定的应用程序设计或体系结构。借助 CodeSmith
可以生成包括简单的强类型集合和完整应用程序在内的任何东西。
当生成应用程序时,无论是编写数据访问代码还是生成自定义集合,你会发现经常需要重复完成某些特定的任务。这时 CodeSmith
就显得特别有用,因为你可以编写模板自动完成这些任务,从而不仅提高你的工作效率,而且能够自动完成那些最为乏味的任务。CodeSmith
附带了许多模板,包括对应于所有 .NET
集合类型的模板以及用于生成存储过程的模板,但该工具的真正威力在于能够创建自定义模板。为了使你能够入门,我将快速介绍一下如何生成自定义模板。
生成自定义模板
CodeSmith 模板只是一些可以在任意文本编辑器中创建的文本文件。它们的唯一要求是用 .cst
文件扩展名来保存它们。我将要生成的示例模板将接受一个字符串,然后基于该字符串生成一个类。创建模板的第一步是添加模板头,它可声明模板的语言、目标语言以及简要模板说明:
<%@ CodeTemplate Language="C#" TargetLanguage="C#" Description="Car Template" %>
模板的下一部分是属性声明,在这里可声明将在模板每次运行时指定的属性。就该模板而言,我要使用的唯一属性只是一个字符串,因此属性声明如下所示:
<%@ Property Name="ClassName" Type="String" Category="Context" Description="Class Name" %>
该属性声明将使 ClassName 属性出现在 CodeSmith
属性窗口中,以便可以在模板运行时指定它。下一步是实际生成模板主体,它非常类似于用 ASP.NET 进行编码。你可以在
Figure 3
中查看该模板的主体。[编辑更新 — 6/16/2004:Figure 3 中的代码已被更新,以便对多线程操作保持安全。]
正如你所见,该模板接受字符串输入并使用该类名生成单独的类。在模板主体中,使用与 ASP.NET
中相同的起始和结束标记。在该模板中,我只是插入属性值,但你还可以在这些标记内部使用任意类型的 .NET
代码。在该模板完成之后,你就可以通过双击它或者从 CodeSmith 应用程序中打开它将其加载到 CodeSmith 中。Figure 4 显示了已经加载到 CodeSmith 中的该模板。
Figure 4 CodeSmith 模版
你可以看到左侧的属性正是我在该模板中声明的属性。如果我输入“SingletonClass”作为类名,并单击 Generate 按钮,则生成
Figure 3 的底部显示的类。
CodeSmith
使用起来相当容易,如果能够正确应用,则可以产生一些令人难以置信的结果。面向代码生成的应用程序中最常见的部分之一是数据访问层。CodeSmith
包括一个名为 SchemaExplorer 的特殊的程序集,可用来从表、存储过程或几乎任何其他 SQL Server? 对象生成模板。
CodeSmith 由 Eric J. Smith 编写,下载地址是:
NUnit
NUnit 是为 .NET 框架生成的开放源代码单元测试框架。NUnit
使你可以用你喜欢的语言编写测试,从而测试应用程序的特定功能。当你首次编写代码时,单元测试是一种测试代码功能的很好方法,它还提供了一种对应用程序进行回归测试的方法。NUnit
应用程序提供了一个用于编写单元测试的框架,以及一个运行这些测试和查看结果的图形界面。
编写 NUnit 测试
作为示例,我将测试 .NET 框架中 Hashtable 类的功能,以确定是否可以添加两个对象并且随后检索这些对象。我的第一步是添加对
NUnit.Framework 程序集的引用,该程序集将赋予我对 NUnit 框架的属性和方法的访问权。接下来,我将创建一个类并用
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!"); }这将确认我可以首先向 Hashtable 中添加值并随后检索相应的值 — 这是一个很简单的测试,但能够表现 NUnit 的功能。存在许多测试类型以及各种 Assert 方法,可使用它们来测试代码的每个部分。
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!"); }尽管上述代码中存在一些小的差异,但它们在功能上是完全相同的。
///有关该方法的 XML 文档资料将被提取并保存在 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 使用该数据来创建任意数量的不同文档格式,包括 HTML
帮助文件 (CHM)。在生成 XML 文件以后,下一步是将程序集和 XML 文件加载到 NDoc 中,以便可以对它们进行处理。通过打开 NDoc
并单击 Add 按钮,可以容易地完成该工作。
在将程序集和 XML 文件加载到 NDoc 中并且使用可用的属性范围自定义输出以后,单击 Generate
按钮将启动生成文档资料的过程。使用默认的属性,NDoc 可以生成一些非常吸引人并且实用的 .html 和 .chm
文件,从而以快速有效的方式自动完成原来非常乏味的任务。
NDoc 是一个开放源代码项目,下载地址是:
NAnt
NAnt 是一个基于 .NET 的生成工具,与当前版本的 Visual Studio .NET
不同,它使得为你的项目创建生成过程变得非常容易。当你拥有大量从事单个项目的开发人员时,你不能依赖于从单个用户的座位进行生成。你也不希望必须定期手动生成该项目。你更愿意创建每天晚上运行的自动生成过程。NAnt
使你可以生成解决方案、复制文件、运行 NUnit 测试、发送电子邮件,等等。遗憾的是,NAnt
缺少漂亮的图形界面,但它的确具有可以指定应该在生成过程中完成哪些任务的控制台应用程序和 XML 文件。注意,MSBuild(属于 Visual
Studio 2005 的新的生成平台)为每种健壮的生成方案进行了准备,并且由基于 XML 的项目文件以类似的方式驱动。
实际运行的 NAnt
在该示例中,我将为前面创建的 NUnitExample 解决方案创建一个 NAnt 版本文件。首先,我需要创建一个具有 .build 扩展名的
XML 文件,将其放在我的项目的根目录中,然后向该文件的顶部添加一个 XML 声明。我需要添加到该文件的第一个标记是 project 标记:
项目标记还用于设置项目名称、默认目标以及基目录。Description 标记用于设置该项目的简短说明。The NUnit Example Project
在 target 元素内,我将把 target 的名称设置为 build,并且创建有关该 target 将做哪些工作的说明。我还将创建一个 csc 元素,该元素用于指定应该传递给 csc C# 编译器的数据。让我们看一下该 csc 元素:
首先,我必须设置该 csc 元素的 target。在该例中,我将创建一个 .dll 文件,因此我将 target 设置为 library。接下来,我必须设置 csc 元素的 output,它是将要创建 .dll 文件的位置。最后,我需要设置 debug 属性,它确定了是否在调试中编译该项目。因为我在前面创建了一个用于存储该值的属性,所以我可以使用下面的字符串来访问该属性的值:${debug}。Csc 元素还包含一些子元素。我需要创建两个元素:references 元素将告诉 NAnt 需要为该项目引用哪些程序集,sources 元素告诉 NAnt 要在生成过程中包含哪些文件。在该示例中,我引用了 NUnit.Framework.dll 程序集并包含了 HashtableTest.cs 文件。Figure 8 中显示了完整的生成文件。(你通常还要创建一个干净的 target,用于删除生成的文件,但为了简洁起见,我已经将其省略。)