[.NET]寫個Visual Studio 2010的自定工具
前言
以下參考「Creating a Custom Tool (Single File Generator) for Visual Studio 2010」建立一個記算檔案中有幾行的自定工具。
不需註冊組件及將組件拉到GAC之中,只要寫好組件,再設定好註冊資訊就可以了!
以下將一步一步的介紹,
實作
1.建立一個類別庫的專案,叫MyCustomTool,Class命名為SampleGenerator
2.加入 Microsoft.VisualStudio.Shell.10.0 及 Microsoft.VisualStudio.Shell.Interop 的參考(如果沒有,請安裝Visual Studio 2010 SP1 SDK)。
3.在專案屬性->應用程式 Tab中,按下組件資訊的Button,勾選「讓組件成為COM-Visible(M)」,如下圖。
4.在專案屬性->建置 Tab中,不要勾選 「註冊COM Interop(C)」,因為我們要手動設定到註冊資訊之中,如下圖。
5.在專案屬性->簽署 Tab中,勾選「簽署組件(A)」,並新增一個強式名稱金鑰檔,如下圖。
6.在Class檔案中加入以下的using的Code,
using System.Runtime.InteropServices; using Microsoft.VisualStudio.Shell.Interop; using Microsoft.VisualStudio;
7.設定Class的ComVisible屬性為true,建立GUID並實作IVsSingleFileGenerator 介面。
[ComVisible(true)] [Guid("95B8B614-5BA4-45DE-B080-9403C2C77556")] public class SampleGenerator : IVsSingleFileGenerator { }
8.在Class檔案中,實作 DefaultExtension Method,設定產生的附檔名為txt,如下,
{ pbstrDefaultExtension = ".txt"; return pbstrDefaultExtension.Length; }
9.在Class檔案中,實作 Generate Method,將算出來的行數,寫到產生的檔案之中,如下,
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; //System.Windows.Forms.MessageBox.Show(length.ToString()); return VSConstants.S_OK; }
10.將組件的COM資訊加入到註冊資訊之中(範例程式中的RegCOM.reg,改好後,DBClick或是按右鍵選取 合併 )。
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\10.0\CLSID\{95B8B614-5BA4-45DE-B080-9403C2C77556}] "InprocServer32"="C:\\Windows\\SysWOW64\\mscoree.dll" "ThreadingModel"="Both" "Class"="MyCustomTool.SampleGenerator" "Assembly"="MyCustomTool, Version=1.0.0.0, Culture=neutral, PublicKeyToken=01828161fe9a9060" "CodeBase"=file:///P:\\Example\\MyCustomTool\\MyCustomTool\\bin\\Debug\\MyCustomTool.dll
註:
範例的CLSID是95B8B614-5BA4-45DE-B080-9403C2C77556,如果您使用不同的GUID,請更換它。以上是在x64的OS,如果您的OS是x86的話,那註冊檔的Path可能是 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0
組件的PublickeyToken的值,您可在Visual Studio 命令視窗中,輸入 sn -T 組件FullPath 取得,如下圖(顯示出來的是01828161fe9a9060),
CodeBase指的是您放DLL的Path。
11.將組件新增到Visual Studio 2010的自定工具註冊資訊之中(範例中RegVSGen.reg)。
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\10.0\Generators\{FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}\MyCustomTool] "CLSID"="{95B8B614-5BA4-45DE-B080-9403C2C77556}" "GeneratesDesignTimeSource"=dword:00000001 @="MyCustom Generator"
12.開啟Visual Studio 2010,建立一個專案,新增一個文字檔,選擇該文字檔,在屬性視窗的自定工具屬性輸入「MyCustomTool」後,就會執行我們寫的MyCustomTool自定工具,並產生txt檔。
範例程式
參考資料
Creating a Custom Tool (Single File Generator) for Visual Studio 2010
gacutil.exe 一問
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^