天天看點

一起談.NET技術,從資料到代碼—通過代碼生成機制實作強類型程式設計[下篇]  一、讓MessageCodeGenerator繼承BaseCodeGeneratorWithSite  二、将MessageCodeGenerator注冊成COM元件  四、通過Custom Tool直接通過XML生成C#代碼  五、将MessageCodeGenerator和檔案擴充名綁定

  除了添加對Microsoft.VisualStudio.TextTemplating.VSHost.10.0.dll程式集的引用外,你還需要添加兩個額外的程式集引用:Microsoft.VisualStudio.OLE.Interop.dll和Microsoft.VisualStudio.Shell.Interop.dll,它們所在的目錄分别是%ProgramFiles%Microsoft Visual Studio 2010 SDK\VisualStudioIntegration\Common\Assemblies\v4.0和%ProgramFiles%Microsoft Visual Studio 2010 SDK\VisualStudioIntegration\Common\Assemblies\v2.0。

  到目前我們MessageCodeGenerator完全通過托管程式編寫,但是VS和擴充是通過COM的方式進行互動的,是以我們需要将MessageCodeGenerator注冊成COM元件。我們首先需要做的是對MessageCodeGenerator所在的程式集進行注冊。一般地,進行注冊的程式集都具有一個強名稱,是以我們先對程式集進行簽名。這隻需要對定義MessageCodeGenerator所在的項目的“簽名”選項進行如下設定就可以了。

一起談.NET技術,從資料到代碼—通過代碼生成機制實作強類型程式設計[下篇]  一、讓MessageCodeGenerator繼承BaseCodeGeneratorWithSite  二、将MessageCodeGenerator注冊成COM元件  四、通過Custom Tool直接通過XML生成C#代碼  五、将MessageCodeGenerator和檔案擴充名綁定

  程式集的注冊通過指令行工具RegAsm.exe完成,我們隻需要啟動通過VS 2010的命名行工具,執行RegAsm.exe指令對編譯生成的程式集進行注冊。

  實際上,我們也可以直接通過VS對相應的項目進行相應的設定,讓VS在編譯完成後自動完成對目标程式基的注冊。你隻需要在項目設定對話框中的Build頁,鈎選“Register for COM interop”即可。

一起談.NET技術,從資料到代碼—通過代碼生成機制實作強類型程式設計[下篇]  一、讓MessageCodeGenerator繼承BaseCodeGeneratorWithSite  二、将MessageCodeGenerator注冊成COM元件  四、通過Custom Tool直接通過XML生成C#代碼  五、将MessageCodeGenerator和檔案擴充名綁定

  注:由于我們的MessageCodeGenerator内部引用到了另一個程式集Microsoft.VisualStudio.Shell.Interop.dll中的某些類型,你需要通過執行如下RegAsm.exe指令行對該程式基進行注冊,并采用/tlb開關生成類型庫。

  三、設定系統資料庫

  到目前為止,我們定義的代碼生成器MessageCodeGenerator已經通過COM元件的形式暴露出來了,我們需要作的就是讓VS能夠正常地加載該COM元件,這通過設定VS相關的系統資料庫資訊來完成。VS2010與代碼生成相關的系統資料庫項定義在HKLM\Software\Microsoft\VisualStudio\10.0\Generators\節點下。該節點下的子節點(Key)均通過相應的GUID表示,不同的GUID實際上表示的是相應的程式設計語言。其中{164B10B9-B200-11D0-8C61-00A0C91E29D5}代表VB.NET,而C#對應的GUID為下圖選中的{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}。

一起談.NET技術,從資料到代碼—通過代碼生成機制實作強類型程式設計[下篇]  一、讓MessageCodeGenerator繼承BaseCodeGeneratorWithSite  二、将MessageCodeGenerator注冊成COM元件  四、通過Custom Tool直接通過XML生成C#代碼  五、将MessageCodeGenerator和檔案擴充名綁定
一起談.NET技術,從資料到代碼—通過代碼生成機制實作強類型程式設計[下篇]  一、讓MessageCodeGenerator繼承BaseCodeGeneratorWithSite  二、将MessageCodeGenerator注冊成COM元件  四、通過Custom Tool直接通過XML生成C#代碼  五、将MessageCodeGenerator和檔案擴充名綁定

  如上圖所示,我們需要對我們添加的系統資料庫鍵進行如下三項設定:

(Default)[REG_SZ]:設定代碼生成器的表述性資訊;

CLSID[REG_SZ]:作為COM元件的代碼生成器的GUID,即我們在定義MessageCodeGenerator類新通過GuidAttribute特性指定的GUID,注意不要忘了花括号;

GeneratesDesignTimeSource[REG_WWORD]: 0或者1,表明是否提供設計時原代碼生成的支援

  現在我們就可以來直接使用我們我們的MessageCodeGenerator了。現在我們建立一個項目,添加一個用于儲存消息的XML檔案,比如起名為Messages.xml,内容如下:

  然後右擊該XML檔案,在彈出的上下文菜單中選擇Properties選項。你會發現在屬性對話框中有個叫作Custom Tool的屬性名稱,在該項上填寫上我們的代碼生成器的名稱:MessageCodeGenerator。

一起談.NET技術,從資料到代碼—通過代碼生成機制實作強類型程式設計[下篇]  一、讓MessageCodeGenerator繼承BaseCodeGeneratorWithSite  二、将MessageCodeGenerator注冊成COM元件  四、通過Custom Tool直接通過XML生成C#代碼  五、将MessageCodeGenerator和檔案擴充名綁定
一起談.NET技術,從資料到代碼—通過代碼生成機制實作強類型程式設計[下篇]  一、讓MessageCodeGenerator繼承BaseCodeGeneratorWithSite  二、将MessageCodeGenerator注冊成COM元件  四、通過Custom Tool直接通過XML生成C#代碼  五、将MessageCodeGenerator和檔案擴充名綁定

  實際上我們可以看出VS代碼生成機制的本質:将一個檔案作為源檔案(Source),利用相應的生成器生成目标檔案(Destination)。至于采用怎樣的生成器,則是通過源檔案的Custom Tool屬性進行比對的。除了這種需要手工設定檔案屬性的方式進行源檔案和生成器之間的比對關系外,還具有另一種更為友善的比對方式:基于源檔案擴充名的比對。

  現在我們的消息檔案時通過一個XML檔案(檔案的結構和擴充名均是XML),如果我們現在給它一種特殊的擴充名,并且将設定源檔案擴充名和代碼生成器的比對關系,就無需再手工地為源檔案設定Custom Tool這一屬性了。

一起談.NET技術,從資料到代碼—通過代碼生成機制實作強類型程式設計[下篇]  一、讓MessageCodeGenerator繼承BaseCodeGeneratorWithSite  二、将MessageCodeGenerator注冊成COM元件  四、通過Custom Tool直接通過XML生成C#代碼  五、将MessageCodeGenerator和檔案擴充名綁定
一起談.NET技術,從資料到代碼—通過代碼生成機制實作強類型程式設計[下篇]  一、讓MessageCodeGenerator繼承BaseCodeGeneratorWithSite  二、将MessageCodeGenerator注冊成COM元件  四、通過Custom Tool直接通過XML生成C#代碼  五、将MessageCodeGenerator和檔案擴充名綁定

繼續閱讀