[.NET]寫個Visual Studio 2010的自定工具

[.NET]寫個Visual Studio 2010的自定工具

前言

以下參考「Creating a Custom Tool (Single File Generator) for Visual Studio 2010」建立一個記算檔案中有幾行的自定工具。

不需註冊組件及將組件拉到GAC之中,只要寫好組件,再設定好註冊資訊就可以了!

以下將一步一步的介紹,

 

實作

1.建立一個類別庫的專案,叫MyCustomTool,Class命名為SampleGenerator

1_DLL

 

2.加入 Microsoft.VisualStudio.Shell.10.0 及 Microsoft.VisualStudio.Shell.Interop 的參考(如果沒有,請安裝Visual Studio 2010 SP1 SDK)。

addShellRef

 

3.在專案屬性->應用程式 Tab中,按下組件資訊的Button,勾選「讓組件成為COM-Visible(M)」,如下圖。

COMVisible

 

4.在專案屬性->建置 Tab中,不要勾選 「註冊COM Interop(C)」,因為我們要手動設定到註冊資訊之中,如下圖。

COMReg

 

5.在專案屬性->簽署 Tab中,勾選「簽署組件(A)」,並新增一個強式名稱金鑰檔,如下圖。

CreateSN

 

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 
{

}

CreateGUID

ImpleteInterface

 

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

image

註:
範例的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),

sn-T

 

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"

image

 

12.開啟Visual Studio 2010,建立一個專案,新增一個文字檔,選擇該文字檔,在屬性視窗的自定工具屬性輸入「MyCustomTool」後,就會執行我們寫的MyCustomTool自定工具,並產生txt檔。

image

image

 

 

範例程式

 

參考資料

Creating a Custom Tool (Single File Generator) for Visual Studio 2010

Custom Tools Explained

gacutil.exe 一問

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^