為VS定制一個自己的代碼生成器


以前用VS一直不知道自定義工具這家伙是干什么用的,后來漸漸明白是用來生成代碼的。現在一個項目需要將一個自定義格式的XML轉換為代碼,就想到要自己做一個自定義工具來生成代碼,於是找了網上一些資料,終於開發成功。

第一步,編寫代碼

在VS里創建一個類庫,這與一般的過程沒什么兩樣,然后需要添加兩個DLL的引用,一個是Microsoft.VisualStudio.Shell.Interop.DLL,另一個是Microsoft.VisualStudio.Shell.DLL。但奇怪的是,這兩個DLL並沒有出現在添加引用的對話框里,我找了很久,最后還是直接從GAC的目錄里復制出來的。 

接下來,創建一個類,這個類需要實現IVsSingleFileGenerator接口。關於接口的詳細說明,請參考MSDN。這個接口有兩個成員,一個是DefaultExtension,用來獲取所生成文件的擴展名,另一個是Generate,就是需要實現代碼生成的地方了。來看一下我的測試代碼,這些代碼是從Code Project上復制過來的。

 View Code

     public  class LineCountGenerator : IVsSingleFileGenerator
    {
         public  int DefaultExtension( out  string pbstrDefaultExtension)
        {
            pbstrDefaultExtension =  " .txt ";
             return pbstrDefaultExtension.Length;
        }

         public  int Generate( string wszInputFilePath,  string bstrInputFileContents,  string wszDefaultNamespace, IntPtr[] rgbOutputFileContents,  out  uint pcbOutput, IVsGeneratorProgress pGenerateProgress)
        {
             int lineCount = bstrInputFileContents.Split( ' \n ').Length;
             byte[] bytes = Encoding.UTF8.GetBytes(lineCount.ToString());
             int length = bytes.Length;
            rgbOutputFileContents[ 0] = Marshal.AllocCoTaskMem(length);
            Marshal.Copy(bytes,  0, rgbOutputFileContents[ 0], length);
            pcbOutput = ( uint)length;
             return VSConstants.S_OK;
        }
    }

稍微解釋一下,這個生成器的作用就是將源文件的行數寫入到一個文本文件中。來看Generate方法的實現,首先從源文件中分析出行數,但我們無法將這個信息以傳統的.net方式寫入輸出文件中,而是要通過Marshal與非托管的VS交換數據。這就需要把行數轉換成字符串后獲得相應的字節數組,再將這個字節數組寫入到從系統分配來的COM任務內存中。所分配的內存不需要我們去釋放,VS會替我們搞定的。(其實COM我並不懂,照樣做准沒錯就是了)

第二步,准備程序集

因為自定義工具必須是一個COM組件,所以還需要把DLL設置為COM可見,這個很容易,在Properties目錄的AssemblyInfo.cs中,把ComVisible的參數改為true。然后為剛才的LineCountGenerator加上一個GuidAttribute就可以了。

程序必須要放在GAC里才能被VS直接調用,而程序集必須要進行簽名才能放入GAC,所以我們還得為DLL進行簽名。只需要在項目的屬性里做一個簡單的設置就可以了,當然不嫌麻煩的話也可以用sn.exe。

接下來,編譯后,打開VS的命令提示符,然后轉到程序集所在的目錄,分別用regasm和gacutil對所生成的DLL進行注冊。

第三步,讓VS知道

VS通過注冊表存放自定義工具的信息,位置在:

32位:HKLM\Software\Microsoft\VisualStudio\版本\Generators\語言
64位:HKLM\Software\Wow6432Node\Microsoft\VisualStudio\版本\Generators\語言 

其中,版本就你當前所使用的VS的版本號,2010是10.0,2008是9.0。語言就是程序開發語言的GUID,對於C#來說,是{FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}。 

通過注冊表編輯器打開后,你會看到下面已經有一些自定義工具了,不解析,照葫蘆畫瓢就可以了。

第四步,使用自定義工具

到此為止,自定義工具已經搞定,接下來就是使用它了。很簡單,在解決方案瀏覽器中某個文件的屬性里,在自定義工具一欄中輸入工具的名稱就可以了。不要問我應該輸入什么內容,折騰了老半天你應該知道的。 輸入之后敲回車,你會發現加號下面多了一個文件,哈哈,這就是我們的代碼生成。


因為時間關系,我沒有將整個過程寫得很細致,考慮到有這種需求的人應該有一定的基礎,所以我就省點口水了,呵呵。下面列出幾篇參考文章,有不明白的地方可以去看看,我也是從這里面學出來的。

http://www.codeproject.com/Articles/31257/Custom-Tools-Explained
http://msdn.microsoft.com/en-us/library/bb166817.aspx
http://www.drewnoakes.com/snippets/WritingACustomCodeGeneratorToolForVisualStudio/ 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM