您的位置:首页 > 其它

.NET 开发人员应该下载的十个必备工具

2008-01-11 14:56 453 查看
除非你使用可获得的最好的工具,否则别指望能生成一流的应用程序。除了VisualStudio.NET这种大型工具以外,你从.NET社区还可以获得许多小型的、不太为人所知的工具。我在本文中将向你介绍几个目前可以获得的、面向.NET开发的最好的免费工具。我将引领你完成一个有关如何使用每种工具的快速教程——有些工具在许多场合可以节约你的时间,而另一些工具则可能完全改变你编写代码的方式。因为我要在本篇文章中介绍如此之多的不同工具,所以我无法详尽讨论其中每种工具,但你应该充分了解每种工具的信息,以便决定哪些工具对你的项目有用。


SnippetCompiler
  SnippetCompiler是一个基于Windows的小型应用程序,你可以通过它来编写、编译和运行代码。如果你具有较小的代码段,并且你不想创建完整的VisualStudio.NET项目(以及该项目附带的所有文件),则该工具会很有用。
例如,假设我希望向你示范如何从Microsoft.NET框架中启动另一个应用程序。在SnippetCompiler中,我将通过新建一个能够创建小型控制台应用程序的文件开始。可以在该控制台应用程序的Main方法内部创建代码片段,而这正是我要在这里做的事情。下面的代码片段演示了如何从.NET框架中创建记事本实例:

System.Diagnostics.Processproc=newSystem.Diagnostics.Process();proc.StartInfo.FileName="notepad.exe";proc.Start();proc.WaitForExit();

  当然该代码片段本身无法编译,而这正是SnippetCompiler的用武之地。Figure1显示了SnippetCompiler中的这一代码示例。



Figure1SnippetCompiler运行画面

  为了测试该代码片段,只须按play(运行)按钮(绿色三角形),它就会在调试模式下运行。该代码片段将生成一个弹出式控制台应用程序,并且将显示记事本。当你关闭记事本时,该控制台应用程序也将关闭。
就我个人而言,我是在尝试为某位有求于我的人士创建一个小型示例时,才发现SnippetCompiler是个无价之宝——如果不使用该工具,那么我通常必须新建一个项目,确保每个部分都能编译通过,然后将代码片段发送给求助者,最后删除该项目。SnippetCompiler使得这一过程变得更容易、更爽快。
SnippetCompiler由JeffKey编写,下载地址是:http://www.sliver.com/dotnet/SnippetCompiler


Regulator
Regulator是最近添加到我的头等工具清单中的。它是一种很有特色的工具,能够使生成和测试正则表达式变得很容易。由于正则表达式在.NET框架中受到极好的支持,因而人们对正则表达式重新产生了兴趣。正则表达式用来基于字符、频率和字符顺序定义字符串中的模式。它们最常见的用途是作为验证用户输入有效性的手段或者作为在较大字符串中查找字符串的方法——例如,在Web页上查找URL或电子邮件地址。
  Regulator允许你输入一个正则表达式以及一些针对其运行该表达式的输入。这样,在应用程序中实现该正则表达式之前,你便可以了解它将产生什么效果以及它将返回哪些种类的匹配项。Figure2显示了带有简单正则表达式的Regulator。



Figure2Regulator运行画面

文档中包含该正则表达式——在该示例中,它是[0-9]*,应该匹配一行中任意数量的数字。右下侧的框中含有针对该正则表达式的输入,而左下侧的框显示了该正则表达式在输入内容中找到的匹配项。象这样在单独应用程序中编写和测试正则表达式,要比尝试在你自己应用程序中处理它们容易得多。
  Regulator中的最佳功能之一——是能够在regexlib.com搜索在线正则表达式库。例如,如果你在搜索框中输入字符串“phone”,你将找到20种多种不同的能够匹配各种电话号码的正则表达式,包括用于英国、澳大利亚的表达式以及其它许多电话号码。Regulator由RoyOsherove编写,下载地址是:http://royo.is-a-geek.com/regulator


CodeSmith
CodeSmith是一种基于模板的代码生成工具,它使用类似于ASP.NET的语法来生成任意类型的代码或文本。与其它许多代码生成工具不同,CodeSmith不要求你订阅特定的应用程序设计或体系结构。借助CodeSmith可以生成包括简单的强类型集合和完整应用程序在内的任何东西。
  当生成应用程序时,无论是编写数据访问代码还是生成自定义集合,你会发现经常需要重复完成某些特定的任务。这时CodeSmith就显得特别有用,因为你可以编写模板自动完成这些任务,从而不仅提高你的工作效率,而且能够自动完成那些最为乏味的任务。CodeSmith附带了许多模板,包括对应于所有.NET集合类型的模板以及用于生成存储过程的模板,但该工具的真正威力在于能够创建自定义模板。为了使你能够入门,我将快速介绍一下如何生成自定义模板。

生成自定义模板
CodeSmith模板只是一些可以在任意文本编辑器中创建的文本文件。它们的唯一要求是用.cst文件扩展名来保存它们。我将要生成的示例模板将接受一个字符串,然后基于该字符串生一个类。创建模板的第一步是添加模板头,它可声明模板的语言、目标语言以及简要模板说明:


  模板的下一部分是属性声明,在这里可声明将在模板每次运行时指定的属性。就该模板而言,我要使用的唯一属性只是一个字符串,因此属性声明如下所示:


  该属性声明将使ClassName属性出现在CodeSmith属性窗口中,以便可以在模板运行时指定它。下一步是实际生成模板主体,它非常类似于用ASP.NET进行编码。你可以在Figure3中查看该模板的主体。[编辑更新—6/16/2004:Figure3中的代码已被更新,以便对多线程操作保持安全。]
正如你所见,该模板接受字符串输入并使用该类名生成单独的类。在模板主体中,使用与ASP.NET中相同的起始和结束标记。在该模板中,我只是插入属性值,但你还可以在这些标记内部使用任意类型的.NET代码。在该模板完成之后,你就可以通过双击它或者从CodeSmith应用程序中打开它将其加载到CodeSmith中。Figure4显示了已经加载到CodeSmith中的该模板。



Figure4CodeSmith模版

  你可以看到左侧的属性正是我在该模板中声明的属性。如果我输入“SingletonClass”作为类名,并单击Generate按钮,则生成Figure3的底部显示的类。
CodeSmith使用起来相当容易,如果能够正确应用,则可以产生一些令人难以置信的结果。面向代码生成的应用程序中最常见的部分之一是数据访问层。CodeSmith包括一个名为SchemaExplorer的特殊的程序集,可用来从表、存储过程或几乎任何其他SQLServer?对象生成模板。
CodeSmith由EricJ.Smith编写,下载地址是:http://www.ericjsmith.net/codesmith


NUnit
NUnit是为.NET框架生成的开放源代码单元测试框架。NUnit使你可以用你喜欢的语言编写测试,从而测试应用程序的特定功能。当你首次编写代码时,单元测试是一种测试代码功能的很好方法,它还提供了一种对应用程序进行回归测试的方法。NUnit应用程序提供了一个用于编写单元测试的框架,以及一个运行这些测试和查看结果的图形界面。

编写NUnit测试
作为示例,我将测试.NET框架中Hashtable类的功能,以确定是否可以添加两个对象并且随后检索这些对象。我的第一步是添加对NUnit.Framework程序集的引用,该程序集将赋予我对NUnit框架的属性和方法的访问权。接下来,我将创建一个类并用TestFixture属性标记它。该属性使NUnit可以知道该类包含NUnit测试:

usingSystem;usingSystem.Collections;usingNUnit.Framework;namespaceNUnitExample{[TestFixture]publicclassHashtableTest{publicHashtableTest(){}}}

  下一步,我将创建一个方法并用[Test]属性标记它,以便NUnit知道该方法是一个测试。然后,我将建立一个Hashtable并向其添加两个值,再使用Assert.AreEqual方法查看我是否可以检索到与我添加到Hashtable的值相同的值,如下面的代码所示:

[Test]publicvoidHashtableAddTest(){Hashtableht=newHashtable();ht.Add("Key1","Value1");ht.Add("Key2","Value2");Assert.AreEqual("Value1",ht["Key1"],"Wrongobjectreturned!");Assert.AreEqual("Value2",ht["Key2"],"Wrongobjectreturned!");}

  这将确认我可以首先向Hashtable中添加值并随后检索相应的值—这是一个很简单的测试,但能够表现NUnit的功能。存在许多测试类型以及各种Assert方法,可使用它们来测试代码的每个部分。
要运行该测试,我需要生成项目,在NUnit应用程序中打开生成的程序集,然后单击Run按钮。Figure5显示了结果。当我看到那个大的绿色条纹时,我有一种兴奋和头晕的感觉,因为它让我知道测试已经通过了。这个简单的示例表明NUnit和单元测试是多么方便和强大。由于能够编写可以保存的单元测试,并且每当你更改代码时都可以重新运行该单元测试,你不仅可以更容易地检测到代码中的缺陷,而且最终能够交付更好的应用程序。



Figure5NUnit

  NUnit是一个开放源代码项目,下载地址是:http://www.nunit.org/。还有一个优秀的NUnitVisualStudio.NET外挂程序,它使你可以直接从VisualStudio中运行单元测试。你可以在http://sourceforge.net/projects/nunitaddin找到它。有关NUnit及其在测试驱动开发中的地位的详细信息,请参阅文章:“Test-DrivenC#:ImprovetheDesignandFlexibilityofYourProjectwithExtremeProgrammingTechniques”


FxCop
.NET框架非常强大,这意味极有可能创建优秀的应用程序,但也同样存在创建劣质程序的可能。FxCop是有助于创建更好的应用程序的工具之一,通过分析程序集,并使用许多不同的规则来检查它是否符合这些规则。FxCop随附了由Microsoft创建的一组规则,你也可以创建并包括你自己的规则。例如,如果你决定所有的类都应该具有一个不带任何参数的默认构造函数,则可以编写一条规则,以确保程序集的每个类上都具有一个构造函数。这样,无论是谁编写该代码,你都将获得一定程度的一致性。如果你需要有关创建自定义规则的详细信息,参见JohnRobbins有关这方面的Bugslayer专栏文章。
那么,让我们看看实际运行的FxCop,并且留心一下它在我正在开发的NUnitExample程序集中找到什么错误。当你打开FxCop时,你首先需要创建一个FxCop项目,然后向其添加你要测试的程序集。在将该程序集添加到项目以后,就可以按Analyze,FxCop将分析该程序集。Figure6显示了FxCop在该程序集中找到的错误和警告。



Figure6FxCop运行画面

  FxCop在我的程序集中找到了几个问题。你可以双击某个错误以查看详细信息,包括规则说明以及在哪里可以找到更多信息。(你可以做的一件有趣的事情是在框架程序集上运行FxCop并查看发生了什么事情。)
FxCop可以帮助你创建更好的、更一致的代码,但它无法补偿低劣的应用程序设计或非常简单拙劣的编程。FxCop也不能替代对等代码检查,但是因为它可以在进行代码检查之前捕获大量错误,所以你可以花费更多时间来解决严重的问题,而不必担心命名约定。FxCop由Microsoft开发,下载地址是:http://www.gotdotnet.com/team/fxcop


LutzRoeder的.NETReflector
下一个必不可少的工具称为.NETReflector,它是一个类浏览器和反编译器,可以分析程序集并向你展示它的所有秘密。.NET框架向全世界引入了可用来分析任何基于.NET的代码(无论它是单个类还是完整的程序集)的反射概念。反射还可以用来检索有关特定程序集中包含的各种类、方法和属性的信息。使用.NETReflector,你可以浏览程序集的类和方法,可以分析由这些类和方法生成的Microsoft中间语言(MSIL),并且可以反编译这些类和方法并查看C#或VisualBasic?.NET中的等价类和方法。
  为了演示.NETReflector的工作方式,我将加载和分析前面已经显示的NUnitExample程序集。Figure7显示了.NETReflector中加载的该程序集。



Figure7NUnitExample程序集

  在.NETReflector内部,有各种可用来进一步分析该程序集的工具。要查看构成某个方法的MSIL,请单击该方法并从菜单中选择Disassembler。
除了能够查看MSIL以外,你还可以通过选择Tools菜单下的Decompiler来查看该方法的C#形式。通过在Languages菜单下更改你的选择,你还可以查看该方法被反编译到VisuaBasic.NET或Delphi以后的形式。以下为.NETReflector生成的代码:

publicvoidHashtableAddTest(){Hashtablehashtable1;hashtable1=newHashtable();hashtable1.Add("Key1","Value1");hashtable1.Add("Key2","Value2");Assert.AreEqual("Value1",hashtable1["Key1"],"Wrongobjectreturned!");Assert.AreEqual("Value2",hashtable1["Key2"],"Wrongobjectreturned!");}

前面的代码看起来非常像我为该方法实际编写的代码。以下为该程序集中的实际代码:

publicvoidHashtableAddTest(){Hashtableht=newHashtable();ht.Add("Key1","Value1");ht.Add("Key2","Value2");Assert.AreEqual("Value1",ht["Key1"],"Wrongobjectreturned!");Assert.AreEqual("Value2",ht["Key2"],"Wrongobjectreturned!");}

尽管上述代码中存在一些小的差异,但它们在功能上是完全相同的。
  虽然该示例是一种显示实际代码与反编译代码之间对比的好方法,但在我看来,它并不代表.NETReflector所具有的最佳用途—分析.NET框架程序集和方法。.NET框架提供了许多执行类似操作的不同方法。例如,如果你需要从XML中读取一组数据,则存在多种使用XmlDocument、XPathNavigator或XmlReader完成该工作的不同方法。通过使用.NETReflector,你可以查看Microsoft在编写数据集的ReadXml方法时使用了什么,或者查看他们在从配置文件读取数据时做了哪些工作。.NETReflector还是一个了解以下最佳实施策略的优秀方法:创建诸如HttpHandlers或配置处理程序之类的对象,因为你可以了解到Microsoft工作组实际上是如何在框架中生成这些对象的。
.NETReflector由LutzRoeder编写,下载地址是:http://www.aisto.com/roeder/dotnet


NDoc
编写代码文档资料几乎总是一项令人畏惧的任务。我所说的不是早期设计文档,甚至也不是更为详细的设计文档;我说的是记录类上的各个方法和属性。NDoc工具能够使用反射来分析程序集,并使用从C#XML注释生成的XML自动为代码生成文档资料。XML注释仅适用于C#,但有一个名为VBCommenter的VisualStudio.NETPowerToy,它能够为VisualBasic.NET完成类似的工作。此外,下一版本的VisualStudio将为更多语言支持XML注释。
  使用NDoc时,你仍然在编写代码的技术文档,但你是在编写代码的过程中完成了文档编写工作(在XML注释中),而这更容易忍受。使用NDoc时,第一步是为你的程序集打开XML注释生成功能。右键单击该项目并选择Properties|ConfigurationProperties|Build,然后在XMLDocumentationFile选项中输入用于保存XML文件的路径。当该项目生成时,将创建一个XML文件,其中包含所有XML注释。下面是NUnit示例中的一个用XML编写了文档的方法:

//////ThistestaddsanumberofvaluestotheHashtablecollection///andthenretrievesthosevaluesandchecksiftheymatch.///[Test]publicvoidHashtableAddTest(){//MethodBodyHere}

有关该方法的XML文档资料将被提取并保存在XML文件中,如下所示:

ThistestaddsanumberofvaluestotheHashtablecollectionandthenretrievesthosevaluesandchecksiftheymatch.

  NDoc使用反射来考察你的程序集,然后读取该文档中的XML,并且将它们进行匹配。NDoc使用该数据来创建任意数量的不同文档格式,包括HTML帮助文件(CHM)。在生成XML文件以后,下一步是将程序集和XML文件加载到NDoc中,以便可以对它们进行处理。通过打开NDoc并单击Add按钮,可以容易地完成该工作。
  在将程序集和XML文件加载到NDoc中并且使用可用的属性范围自定义输出以后,单击Generate按钮将启动生成文档资料的过程。使用默认的属性,NDoc可以生成一些非常吸引人并且实用的.html和.chm文件,从而以快速有效的方式自动完成原来非常乏味的任务。
NDoc是一个开放源代码项目,下载地址是:http://ndoc.sourceforge.net/


NAnt
NAnt是一个基于.NET的生成工具,与当前版本的VisualStudio.NET不同,它使得为你的项目创建生成过程变得非常容易。当你拥有大量从事单个项目的开发人员时,你不能依赖于从单个用户的座位进行生成。你也不希望必须定期手动生成该项目。你更愿意创建每天晚上运行的自动生成过程。NAnt使你可以生成解决方案、复制文件、运行NUnit测试、发送电子邮件,等等。遗憾的是,NAnt缺少漂亮的图形界面,但它的确具有可以指定应该在生成过程中完成哪些任务的控制台应用程序和XML文件。注意,MSBuild(属于VisualStudio2005的新的生成平台)为每种健壮的生成方案进行了准备,并且由基于XML的项目文件以类似的方式驱动。

实际运行的NAnt
  在该示例中,我将为前面创建的NUnitExample解决方案创建一个NAnt版本文件。首先,我需要创建一个具有.build扩展名的XML文件,将其放在我的项目的根目录中,然后向该文件的顶部添加一个XML声明。我需要添加到该文件的第一个标记是project标记:

TheNUnitExampleProject

  项目标记还用于设置项目名称、默认目标以及基目录。Description标记用于设置该项目的简短说明。
  接着,我将添加property标记,该标记可用于将设置存储到单个位置(随后可以从文件中的任意位置访问该位置)。在该例中,我将创建一个名为debug的属性,我可以随后将其设置为true或false,以反映我是否要在调试配置下编译该项目。(最后,这一特定属性并未真正影响如何生成该项目;它只是你设置的一个变量,当你真正确定了如何生成该项目时将读取该变量。)
  接下来,我需要创建一个target标记。一个项目可以包含多个可在NAnt运行时指定的target。如果未指定target,则使用默认target(我在project元素中设置的target)。在该示例中,默认target是build。让我们观察一下target元素,它将包含大多数生成信息:


  在target元素内,我将把target的名称设置为build,并且创建有关该target将做哪些工作的说明。我还将创建一个csc元素,该元素用于指定应该传递给cscC#编译器的数据。让我们看一下该csc元素:


  首先,我必须设置该csc元素的target。在该例中,我将创建一个.dll文件,因此我将target设置为library。接下来,我必须设置csc元素的output,它是将要创建.dll文件的位置。最后,我需要设置debug属性,它确定了是否在调试中编译该项目。因为我在前面创建了一个用于存储该值的属性,所以我可以使用下面的字符串来访问该属性的值:${debug}。Csc元素还包含一些子元素。我需要创建两个元素:references元素将告诉NAnt需要为该项目引用哪些程序集,sources元素告诉NAnt要在生成过程中包含哪些文件。在该示例中,我引用了NUnit.Framework.dll程序集并包含了HashtableTest.cs文件。Figure8中显示了完整的生成文件。(你通常还要创建一个干净的target,用于删除生成的文件,但为了简洁起见,我已经将其省略。)
要生成该文件,我需要转到我的项目的根目录(生成文件位于此处),然后从该位置执行nant.exe。如果生成成功,你可以在该应用程序的bin目录中找到.dll和.pdb文件。尽管使用NAnt肯定不像在VisualStudio中单击Build那样简单,但它仍然是一种非常强大的工具,可用于开发按自动计划运行的生成过程。NAnt还包括一些有用的功能,例如能够运行单元测试或者复制附加文件(这些功能没有受到当前VisualStudio生成过程的支持)。NAnt是一个开放源代码项目,下载地址是:http://nant.sourceforge.net/


转换工具
我已经将两个独立的工具合在一起放在标题“转换工具”下面。这两个工具都非常简单,但又可能极为有用。第一个工具是ASP.NET版本转换器,它可用于转换ASP.NT(虚拟目录在它下面运行)的版本。第二个工具是VisualStudioConverter,它可用于将项目文件从VisualStudio.NET2002转换到VisualStudio.NET2003。
  当IIS处理请求时,它会查看正在请求的文件的扩展名,然后基于该Web站点或虚拟目录的扩展名映射,将请求委派给ISAPI扩展或者自己处理该请求。这正是ASP.NET的工作方式;将为所有ASP.NET扩展名注册扩展名映射,并将这些扩展名映射导向aspnet_isapi.dll。这种工作方式是完美无缺的,除非你安装了ASP.NET1.1—它会将扩展名映射升级到新版本的aspnet_isapi.dll。当在ASP.NET1.0上生成的应用程序试图用1.1版运行时,这会导致错误。要解决该问题,可以将所有扩展名映射重新转换到1.0版的aspnet_isapi.dll,但是由于有18种扩展名映射,所以手动完成这一工作将很枯燥。这正是ASP.NET版本转换器可以发挥作用的时候。使用这一小型实用工具,可以转换任何单个ASP.NET应用程序所使用的.NET框架的版本。



Figure9ASP.NET版本转换器

Figure9显示了实际运行的ASP.NET版本转换器。它的使用方法非常简单,只须选择相应的应用程序,然后选择你希望该应用程序使用的.NET框架版本。该工具随后将使用aspnet_regiis.exe命令行工具将该应用程序转换到所选版本的框架。随着将来版本的ASP.NET和.NET框架的发布,该工具将变得更为有用。
ASP.NET版本转换器由DenisBauer编写,下载地址是:http://www.denisbauer.com/NETTools/ASPNETVersionSwitcher.aspx
  VisualStudio.NET项目转换器(参见Figure10)非常类似于ASP.NET版本转换器,区别在于它用于转换VisualStudio项目文件的版本。尽管在.NET框架的1.0版和1.1版之间只有很小的差异,但一旦将项目文件从VisualStudio.NET2002转换到VisualStudio.NET2003,将无法再把它转换回去。虽然这在大多数时候可能不会成为问题(因为在.NET框架1.0版和1.1版之间几乎没有什么破坏性的更改),但在某些时刻你可能需要将项目转换回去。该转换器可以将任何解决方案或项目文件从VisualStudio7.1(VisualStudio.NET2003)转换到VisualStudio7.0(VisualStudio.NET2002),并在必要时进行反向转换。



Figure10VisualStudio.NET项目转换器

VisualStudio.NET项目转换器由DacrisSoftware编写。下载地址是:http://www.codeproject.com/macro/vsconvert.asp

delnedved
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: