原文出處:.NET Tools:Ten Must-Have Tools Every Developer Should Download Now
本文使用了以下技術:.NET,C#,Visual Basic .NET,Visual Studio .NET System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.StartInfo.FileName= "notepad.exe"; proc.Start(); proc.WaitForExit(); 當然該代碼片段本身無法編譯,而這正是 Snippet Compiler 的用武之地。Figure 1 顯示了 Snippet Compiler 中的這一代碼示例。 <%@ 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 中的代碼已被更新,以便對多線程操作保持安全。] 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 方法,可使用它們來測試代碼的每個部分。 要運行該測試,我需要生成項目,在 NUnit 應用程序中打開生成的程序集,然後單擊 Run 按鈕。Figure 5 顯示了結果。當我看到那個大的綠色條紋時,我有一種興奮和頭暈的感覺,因爲它讓我知道測試已經通過了。這個簡單的示例表明 NUnit 和單元測試是多麼方便和強大。由於能夠編寫可以保存的單元測試,並且每當你更改代碼時都可以重新運行該單元測試,你不僅可以更容易地檢測到代碼中的缺陷,而且最終能夠交付更好的應用程序。 Figure 5 NUnit NUnit 是一個開放源代碼項目,下載地址是:http://www.nunit.org/。還有一個優秀的 NUnit Visual Studio .NET 外掛程序,它使你可以直接從 Visual Studio 中運行單元測試。你可以在 http://sourceforge.net/projects/nunitaddin 找到它。有關 NUnit 及其在測試驅動開發中的地位的詳細信息,請參閱文章:“Test-Driven C#: Improve the Design and Flexibility of Your Project with Extreme Programming Techniques” FxCop .NET 框架非常強大,這意味極有可能創建優秀的應用程序,但也同樣存在創建劣質程序的可能。FxCop 是有助於創建更好的應用程序的工具之一,通過分析程序集,並使用許多不同的規則來檢查它是否符合這些規則。FxCop 隨附了由 Microsoft 創建的一組規則,你也可以創建幷包括你自己的規則。例如,如果你決定所有的類都應該具有一個不帶任何參數的默認構造函數,則可以編寫一條規則,以確保程序集的每個類上都具有一個構造函數。這樣,無論是誰編寫該代碼, 你都將獲得一定程度的一致性。如果你需要有關創建自定義規則的詳細信息,參見 John Robbins 有關這方面的 Bugslayer 專欄文章。 那麼,讓我們看看實際運行的 FxCop,並且留心一下它在我正在開發的 NUnitExample 程序集中找到什麼錯誤。當你打開 FxCop 時,你首先需要創建一個 FxCop 項目,然後向其添加你要測試的程序集。在將該程序集添加到項目以後,就可以按 Analyze,FxCop 將分析該程序集。Figure 6 顯示了 FxCop 在該程序集中找到的錯誤和警告。 Figure 6 FxCop 運行畫面 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 程序集。Figure 7 顯示了 .NET Reflector 中加載的該程序集。 Figure 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 NDoc 編寫代碼文檔資料幾乎總是一項令人畏懼的任務。我所說的不是早期設計文檔,甚至也不是更爲詳細的設計文檔;我說的是記錄類上的各個方法和屬性。NDoc 工具能夠使用反射來分析程序集,並使用從 C# XML 註釋生成的 XML 自動爲代碼生成文檔資料。XML 註釋僅適用於 C#,但有一個名爲 VBCommenter 的 Visual Studio .NET Power Toy,它能夠爲 Visual Basic .NET 完成類似的工作。此外,下一版本的 Visual Studio 將爲更多語言支持 XML 註釋。 使用 NDoc 時,你仍然在編寫代碼的技術文檔,但你是在編寫代碼的過程中完成了文檔編寫工作(在 XML 註釋中),而這更容易忍受。使用 NDoc 時,第一步是爲你的程序集打開 XML 註釋生成功能。右鍵單擊該項目並選擇 Properties | Configuration Properties | Build,然後在 XML Documentation File 選項中輸入用於保存 XML 文件的路徑。當該項目生成時,將創建一個 XML 文件,其中包含所有 XML 註釋。下面是 NUnit 示例中的一個用 XML 編寫了文檔的方法: /// <summary> /// This test adds a number of values to the Hashtable collection /// and then retrieves those values and checks if they match. /// </summary> [Test] public void HashtableAddTest() { //Method Body Here }有關該方法的 XML 文檔資料將被提取並保存在 XML 文件中,如下所示: <member name="M:NUnitExample.HashtableTest.HashtableAddTest"> <summary>This test adds a number of values to the Hashtable collection and then retrieves those values and checks if they match.</summary> </member> NDoc 使用反射來考察你的程序集,然後讀取該文檔中的 XML,並且將它們進行匹配。NDoc 使用該數據來創建任意數量的不同文檔格式,包括 HTML 幫助文件 (CHM)。在生成 XML 文件以後,下一步是將程序集和 XML 文件加載到 NDoc 中,以便可以對它們進行處理。通過打開 NDoc 並單擊 Add 按鈕,可以容易地完成該工作。 <?xml version="1.0"?> <project name="NUnit Example" default="build" basedir="."> <description>The NUnit Example Project</description> </project>項目標記還用於設置項目名稱、默認目標以及基目錄。Description 標記用於設置該項目的簡短說明。 接着,我將添加 property 標記,該標記可用於將設置存儲到單個位置(隨後可以從文件中的任意位置訪問該位置)。在該例中,我將創建一個名爲 debug 的屬性,我可以隨後將其設置爲 true 或 false,以反映我是否要在調試配置下編譯該項目。(最後,這一特定屬性並未真正影響如何生成該項目;它只是你設置的一個變量,當你真正確定了如何生成該項目時將讀取該變量。) 接下來,我需要創建一個 target 標記。一個項目可以包含多個可在 NAnt 運行時指定的 target。如果未指定 target,則使用默認 target(我在 project 元素中設置的 target)。在該示例中,默認 target 是 build。讓我們觀察一下 target 元素,它將包含大多數生成信息: <target name="build" description="compiles the source code"> </target>在 target 元素內,我將把 target 的名稱設置爲 build,並且創建有關該 target 將做哪些工作的說明。我還將創建一個 csc 元素,該元素用於指定應該傳遞給 csc C# 編譯器的數據。讓我們看一下該 csc 元素: <csc target="library" output="./bin/debug/NUnitExample.dll" debug="${debug}"> <references> <includes name="C:/program files/NUnit V2.1/bin/NUnit.Framework.dll"/> </references> <sources> <includes name="HashtableTest.cs"/> </sources> </csc>首先,我必須設置該 csc 元素的 target。在該例中,我將創建一個 .dll 文件,因此我將 target 設置爲 library。接下來,我必須設置 csc 元素的 output,它是將要創建 .dll 文件的位置。最後,我需要設置 debug 屬性,它確定了是否在調試中編譯該項目。因爲我在前面創建了一個用於存儲該值的屬性,所以我可以使用下面的字符串來訪問該屬性的值:${debug}。Csc 元素還包含一些子元素。我需要創建兩個元素:references 元素將告訴 NAnt 需要爲該項目引用哪些程序集,sources 元素告訴 NAnt 要在生成過程中包含哪些文件。在該示例中,我引用了 NUnit.Framework.dll 程序集幷包含了 HashtableTest.cs 文件。Figure 8 中顯示了完整的生成文件。(你通常還要創建一個乾淨的 target,用於刪除生成的文件,但爲了簡潔起見,我已經將其省略。) 要生成該文件,我需要轉到我的項目的根目錄(生成文件位於此處),然後從該位置執行 nant.exe。如果生成成功,你可以在該應用程序的 bin 目錄中找到 .dll 和 .pdb 文件。儘管使用 NAnt 肯定不像在 Visual Studio 中單擊 Build 那樣簡單,但它仍然是一種非常強大的工具,可用於開發按自動計劃運行的生成過程。NAnt 還包括一些有用的功能,例如能夠運行單元測試或者複製附加文件(這些功能沒有受到當前 Visual Studio 生成過程的支持)。 NAnt 是一個開放源代碼項目,下載地址是:http://nant.sourceforge.net/ 轉換工具 我已經將兩個獨立的工具合在一起放在標題“轉換工具”下面。這兩個工具都非常簡單,但又可能極爲有用。第一個工具是 ASP.NET 版本轉換器,它可用於轉換 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 版本轉換器可以發揮作用的時候。使用這一小型實用工具,可以轉換任何單個 ASP.NET 應用程序所使用的 .NET 框架的版本。 Figure 9 ASP.NET 版本轉換器 Figure 9 顯示了實際運行的 ASP.NET 版本轉換器。它的使用方法非常簡單,只須選擇相應的應用程序,然後選擇你希望該應用程序使用的 .NET 框架版本。該工具隨後將使用 aspnet_regiis.exe 命令行工具將該應用程序轉換到所選版本的框架。隨着將來版本的 ASP.NET 和 .NET 框架的發佈,該工具將變得更爲有用。 ASP.NET 版本轉換器由 Denis Bauer 編寫,下載地址是:http://www.denisbauer.com/NETTools/ASPNETVersionSwitcher.aspx Visual Studio .NET 項目轉換器(參見Figure 10)非常類似於 ASP.NET 版本轉換器,區別在於它用於轉換 Visual Studio 項目文件的版本。儘管在 .NET 框架的 1.0 版和 1.1 版之間只有很小的差異,但一旦將項目文件從 Visual Studio .NET 2002 轉換到 Visual Studio .NET 2003,將無法再把它轉換回去。雖然這在大多數時候可能不會成爲問題(因爲在 .NET 框架 1.0 版和 1.1 版之間幾乎沒有什麼破壞性的更改),但在某些時刻你可能需要將項目轉換回去。該轉換器可以將任何解決方案或項目文件從 Visual Studio 7.1 (Visual Studio .NET 2003) 轉換到 Visual Studio 7.0 (Visual Studio .NET 2002),並在必要時進行反向轉換。 Figure 10 Visual Studio .NET 項目轉換器 Visual Studio .NET 項目轉換器由 Dacris Software 編寫。下載地址是:http://www.codeproject.com/macro/vsconvert.asp 總結 本文采用走馬觀花的方式介紹了上述工具,但我已經試圖起碼向你提供足夠的信息以激起你的好奇心。我相信本文已經讓你在某種程度上領悟了幾個免費工具,你可以立即開始使用這些工具來編寫更好的項目。同時,我還要敦促 你確保自己擁有所有其他可以獲得的合適工具,無論是最新版本的 Visual Studio、功能強大的計算機還是免費的實用工具。擁有合適的工具將使一切變得大不相同。 |
作者簡介 James Avery 是一位使用 .NET 和其它微軟技術的顧問。他撰寫了許多書籍和文章,其最新著作是《ASP.NET Setup and Configuration Pocket Reference》(Microsoft Press, 2003)。你可以通過 [email protected] 向他發送電子郵件,並且在 http://www.dotavery.com/blog 閱讀他的網絡日記。 |
本文出自 MSDN Magazine 的 July 2004 期刊,可通過當地報攤獲得,或者最好是 訂閱 |
每個.NET 開發人員應該下載的十個必備工具
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.