•两种不同的转换器工具本转换器和VisualStudio.NET项目转换器
除非您使用能够获得的最佳工具,否则您无法期望生成一流的应用程序。除了像VisualStudio®.NET这样的著名工具以外,还可以从.NET社区获得许多小型的、不太为人所知的工具。在本文中,我将向您介绍一些目前可以获得的、面向.NET开发的最佳免费工具。我将引导您完成一个有关如何使用其中每种工具的快速教程—一些工具在许多时候可以使您节约一分钟,而另一些工具则可能彻底改变您编写代码的方式。因为我要在本篇文章中介绍如此之多的不同工具,所以我无法详尽讨论其中每种工具,但您应该了解到有关每种工具的足够信息,以便判断哪些工具对您的项目有用。
SnippetCompiler是一个基于Windows®的小型应用程序,您可以通过它来编写、编译和运行代码。如果您具有较小的代码段,并且您不希望为其创建完整的VisualStudio.NET项目,以及伴随该项目的所有文件,,则该工具将很有用。
例如,假设我希望向您说明如何从Microsoft?.NET框架中启动另一个应用程序。在SnippetCompiler中,我将通过新建一个能够创建小型控制台应用程序的文件开始。可以在该控制台应用程序的Main方法内部创建代码片段,而这正是我要在这里做的事情。下面的代码片段演示了如何从.NET框架中创建记事本实例,
当然该代码片段本身无法编译,而这正是SnippetCompiler的用武之地。图1显示了SnippetCompiler中的这一代码示例。
要测试该代码片段,只须按play,运行,按钮,绿色三角形,,它就会在调试模式下运行。该代码片段将生成一个弹出式控制台应用程序,并且将显示记事本。当您关闭记事本时,该控制台应用程序也将关闭。
就我个人而言,我是在尝试为某位向我求助的人士创建一个小型示例时,才发现SnippetCompiler是如此宝贵的—如果不使用该工具,则我通常必须新建一个项目,确保每个部分都能编译通过,然后将代码片段发送给求助者,并删除该项目。SnippetCompiler使得这一过程变得更加容易、更加愉快。
Regulator是最后一个添加到我的头等工具清单中的。它是一种很有特色的工具,能够使生成和测试正则表达式变得很容易。人们对正则表达式重新产生了兴趣,因为它们在.NET框架中受到很好的支持。正则表达式用来基于字符、频率和字符顺序定义字符串中的模式。它们最常见的用途是作为验证用户输入有效性的手段或者作为在较大字符串中查找字符串的方法—例如,在Web页上查找URL或电子邮件地址。
Regulator使您可以输入一个正则表达式以及一些针对其运行该表达式的输入内容。这样,在应用程序中实现该正则表达式之前,您可以了解它将产生什么效果以及它将返回哪些种类的匹配项。图2显示了带有简单正则表达式的Regulator。
文档中包含该正则表达式—在该示例中,它是[0-9]*,应该匹配一行中任意数量的数字。右下侧的框中含有针对该正则表达式的输入,而左下侧的框显示了该正则表达式在输入内容中找到的匹配项。在这样的单独应用程序中编写和测试正则表达式,要比尝试在您的应用程序中处理它们容易得多。
Regulator中的最佳功能之一是能够在regexlib搜索联机正则表达式库。例如,如果您在搜索框中输入字符串“phone”,您将找到20种以上能够匹配各种电话号码的不同的正则表达式,包括用于英国、澳大利亚的表达式以及其他许多电话号码。Regulator由RoyOsherove编写,并且可以在下载。
CodeSmith是一种基于模板的代码生成工具,它使用类似于ASP.NET的语法来生成任意类型的代码或文本。与其他许多代码生成工具不同,CodeSmith不要求您订阅特定的应用程序设计或体系结构。使用CodeSmith,可以生成包括简单的强类型集合和完整应用程序在内的任何东西。
当您生成应用程序时,您经常需要重复完成某些特定的任务,例如编写数据访问代码或者生成自定义集合。CodeSmith在这些时候特别有用,因为您可以编写模板自动完成这些任务,从而不仅提高您的工作效率,而且能够自动完成那些最为乏味的任务。CodeSmith附带了许多模板,包括对应于所有.NET集合类型的模板以及用于生成存储过程的模板,但该工具的真正威力在于能够创建自定义模板。为了使您能够入门,我将快速介绍一下如何生成自定义模板。
CodeSmith模板只是一些可以在任意文本编辑器中创建的文本文件。它们的唯一要求是用.cst文件扩展名来保存它们。我将要生成的示例模板将接受一个字符串,然后基于该字符串生成一个类。创建模板的第一步是添加模板头,它可声明模板的语言、目标语言以及简要模板说明,
模板的下一部分是属性声明,在这里可声明将在模板每次运行时指定的属性。就该模板而言,我要使用的唯一属性只是一个字符串,因此属性声明如下所示,
该属性声明将使ClassName属性出现在CodeSmith属性窗口中, 以便可以在模板运行时指定它。下一步是实际生成模板主体,它非常类似于用ASP.NET进行编码。您可以在图3中查看该模板的主体。 [编辑更新—6/16/2004, 图3中的代码已被更新, 以便对多线程操作保持安全。 ]
正如您所见,该模板接受字符串输入并使用该类名生成单独的类。在模板主体中,使用与ASP.NET中相同的起始和结束标记。在该模板中,我只是插入属性值,但您还可以在这些标记内部使用任意类型的.NET代码。在该模板完成之后,您就可以通过双击它或者从CodeSmith应用程序中打开它将其加载到CodeSmith中。 图4显示了已经加载到CodeSmith中的该模板。
您可以看到左侧的属性正是我在该模板中声明的属性。如果我输入“SingletonClass”为类名,并单击Generate按钮,则将生成图3的底部显示的类。
CodeSmith使用起来相当容易,如果能够正确应用,则可以产生一些令人难以置信的结果。面向代码生成的应用程序中最常见的部分之一是数据访问层。 CodeSmith包括一个名为SchemaExplorer的特殊的程序集,可用来从表、存储过程或几乎任何其他SQL Server?对象生成模板。
NUni t是为.NET框架生成的开放源代码单元测试框架。 NUni t使您可以用您喜欢的语言编写测试,从而测试应用程序的特定功能。当您首次编写代码时,单元测试是一种测试代码功能的很好方法,它还提供了一种对应用程序进行回归测试的方法。 NUni t应用程序提供了一个用于编写单元测试的框架, 以及一个运行这些测试和查看结果的图形界面。
作为示例,我将测试.NET框架中Hashtable类的功能, 以确定是否可以添加两个对象并且随后检索这些对象。我的第一步是添加对NUnit.Framework程序集的引用,该程序集将赋予我对NUnit框架的属性和方法的访问权。接下来,我将创建一个类并用TestFixture 属性标记它。该属性使NUni t可以知道该类包含NUni t测试,
下一步,我将创建一个方法并用[Test]属性标记它, 以便NUnit知道该方法是一个测试。然后,我将建立一个Hashtable并向其添加两个值,再使用Assert.AreEqual方法查看我是否可以检索到与我添加到Hashtable的值相同的值,如下面的代码所示,
这将确认我可以首先向Hashtable中添加值并随后检索相应的值—这是一个很简单的测试,但能够表现NUnit的功能。存在许多测试类型以及各种Assert方法,可使用它们来测试代码的每个部分。
要运行该测试,我需要生成项目,在NUnit应用程序中打开生成的程序集,然后单击Run 按钮。 图5显示了结果。当我看到那个大的绿色条纹时,我有一种兴奋和头晕的感觉, 因为它让我知道测试已经通过了。这个简单的示例表明NUni t和单元测试是多么方便和强大。由于能够编写可以保存的单元测试,并且每当您更改代码时都可以重新运行该单元测试,您不仅可以更容易地检测到代码中的缺陷,而且最终能够交付更好的应用程序。
.NET框架非常强大,这意味着存在创建优秀应用程序的极大可能,但是也同样存在创建劣质程序的可能。 FxCop是有助于创建更好的应用程序的工具之一,它所采用的方法是,使您能够分析程序集,并使用一些不同的规则来检查它是否符合这些规则。 FxCop随附了由Microsoft创建的固定数量的规则,但您也可以创建并包括您自己的规则。例如,如果您决定所有的类都应该具有一个不带任何参数的默认构造函数,则可以编写一条规则, 以确保程序集的每个类上都具有一个构造函数。这样,无论是谁编写该代码,您都将获得一定程度的一致性。如果您需要有关创建自定义规则的详细信息,请参阅John Robbins的有关该主题的Bugslayer专栏文章,MSDN®Magazine 2004年6月刊, 。
那么,让我们观察一下实际运行的FxCop,并且看一下它在我一直在处理的NUnitExample 程序集中找到哪些错误。当您打开FxCop时,您首先需要创建一个FxCop项目,然后向其添加您要测试的程序集。在将该程序集添加到项目以后,就可以按Analyze, FxCop将分析该程序集。 图6中显示了在该程序集中找到的错误和警告。
FxCop在我的程序集中找到了几个问题。您可以双击某个错误以查看详细信息,包括规则说明以及在哪里可以找到更多信息。 ,您可以做的一件有趣的事情是在框架程序集上运行FxCop并查看发生了什么事情。 ,
FxCop可以帮助您创建更好的、更一致的代码,但它无法补偿低劣的应用程序设计或非常简单拙劣的编程。 FxCop也不能替代对等代码检查,但是因为它可以在进行代码检查之前捕获大量错误,所以您可以花费更多时间来解决严重的问题,而不必担心命名约定。 FxCop 由Microsoft开发,并且可以从下载。
下一个必不可少的工具称为.NET Reflector,它是一个类浏览器和反编译器,可以分析程序集并向您展示它的所有秘密。 .NET框架向全世界引入了可用来分析任何基于.NET的代码,无论它是单个类还是完整的程序集,的反射概念。反射还可以用来检索有关特定程序集中包含的各种类、方法和属性的信息。使用.NET Reflector,您可以浏览程序集的类和方法,可以分析由这些类和方法生成的Microsoft中间语言(MSIL) ,并且可以反编译这些类和方法并查看C#或Visual Basic ®.NET中的等价类和方法。
在.NET Reflector 内部,有各种可用来进一步分析该程序集的工具。要查看构成某个方法的MSIL,请单击该方法并从菜单中选择Disassembler。
前面的代码看起来非常像我为该方法实际编写的代码。 以下为该程序集中的实际代码,
虽然该示例是一种显示实际代码与反编译代码之间对比的好方法,但在我看来,它并不代表.NET Reflector所具有的最佳用途—分析.NET框架程序集和方法。 .NET框架提供了许多执行类似操作的不同方法。例如,如果您需要从XML中读取一组数据,则存在多种使用XmlDocument、 XPathNavigator或XmlReader完成该工作的不同方法。通过使用.NET Reflector,您可以查看Microsoft在编写数据集的ReadXml方法时使用了什么,或者查看他们在从配置文件读取数据时做了哪些工作。 .NET Reflector还是一个了解以下最佳实施策略的优秀方法,创建诸如HttpHandlers或配置处理程序之类的对象, 因为您可以了解到Microsoft工作组实际上是如何在框架中生成这些对象的。
编写代码文档资料几乎总是一项令人畏惧的任务。我所说的不是早期设计文档,甚至也不是更为详细的设计文档,我说的是记录类上的各个方法和属性。 NDo c工具能够使用反射来分析程序集,并使用从C# XML注释生成的XML 自动为代码生成文档资料。 XML注释仅适用于C#,但有一个名为VBCommenter的Visual Studio .NET Power Toy,它能够为Visual Basic .NET完成类似的工作。此外,下一版本的Visual Studio将为更多语言支持XML注释。
使用NDo c时,您仍然在编写代码的技术文档,但您是在编写代码的过程中完成了文档编写工作,在XML注释中, ,而这更容易忍受。使用NDoc时,第一步是为您的程序集打开XML注释生成功能。右键单击该项目并选择Properties Configuration Properties Build,然后在XML Documentation File选项中输入用于保存XML文件的路径。当该项目生成时,将创建一个XML文件,其中包含所有XML注释。下面是NUn i t示例中的一个用XML编写了文档的方法,
NDoc使用反射来考察您的程序集,然后读取该文档中的XML,并且将它们进行匹配。 NDoc 使用该数据来创建任意数量的不同文档格式,包括HTML帮助文件(CHM) 。在生成XML文件以后,下一步是将程序集和XML文件加载到NDoc中, 以便可以对它们进行处理。通过打开NDo c并单击Add按钮,可以容易地完成该工作。
在将程序集和XML文件加载到NDoc中并且使用可用的属性范围自定义输出以后,单击Generate按钮将启动生成文档资料的过程。使用默认的属性, NDoc可以生成一些非常吸引人并且实用的.html和.chm文件,从而以快速有效的方式自动完成原来非常乏味的任务。
NAnt是一个基于.NET的生成工具,与当前版本的Visual Studio .NET不同,它使得为您的项目创建生成过程变得非常容易。当您拥有大量从事单个项目的开发人员时,您不能依赖于从单个用户的座位进行生成。您也不希望必须定期手动生成该项目。您更愿意创建每天晚上运行的自动生成过程。 NAnt使您可以生成解决方案、复制文件、运行NUn i t测试、发送电子邮件,等等。遗憾的是, NAnt缺少漂亮的图形界面,但它的确具有可以指定应该在生成过程中完成哪些任务的控制台应用程序和XML文件。注意, MSBui ld ,属于Visual Studio 2005的新的生成平台,为每种健壮的生成方案进行了准备,并且由基于XML的项目文件以类似的方式驱动。
在该示例中,我将为前面创建的NUni tExamp l e解决方案创建一个NAnt版本文件。首先,我需要创建一个具有.bui ld扩展名的XML文件,将其放在我的项目的根目录中,然后向该文件的顶部添加一个XML声明。我需要添加到该文件的第一个标记是project标记, ?
The NUnit Example Project 项目标记还用于设置项目名称、默认目标以及基目录。 Description标记用于设置该项目的简短说明。
接下来,我将添加property标记,该标记可用于将设置存储到单个位置,随后可以从文件中的任意位置访问该位置, 。在该例中,我将创建一个名为debug的属性,我可以随后将其设置为true或false, 以反映我是否要在调试配置下编译该项目。 ,最后,这一特定属性并未真正影响如何生成该项目,它只是您设置的一个变量, 当您真正确定了如何生成该项目时将读取该变量。 ,
接下来,我需要创建一个target标记。一个项目可以包含多个可在NAnt运行时指定的target。如果未指定target,则使用默认target ,我在project元素中设置的target, 。在该示例中,默认target是build。让我们观察一下target元素,它将包含大多数生成信息,
在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文件。 图8中显示了完整的生成文件。 ,您通常还要创建一个干净的target,用于删除生成的文件,但为了简洁起见,我已经将其省略。 ,