VisualStudioのPlugin作成は意外と簡単(だったので作ってみた)


VisualStudio2013のPluginの作成方法です。
以前はマクロやアドインで作成していたみたいですが、いまはVSPackageで作るみたいです。

この記事では、エディタ保存時にBuildを走らせるPluginを作ります。
常に動くと邪魔くさいのでツールバーでOn,Offできるようにします。

どういうときに使うPluginかというと、StyleCopの警告を削除するときに使ったりすると便利かなと思っています。

# 作り方

## 準備

Visual Studio SDKをインストールしてください。
http://www.microsoft.com/en-us/download/details.aspx?id=40758

## プロジェクト作成

新しいプロジェクト　→　「テンプレート」「C#」「機能拡張」で「Visual Studio Package」を選択して作成します。
![vspackage.png](https://qiita-image-store.s3.amazonaws.com/0/10494/fe0c47f9-d7a0-f44d-f6f9-712a34211bb3.png "vspackage.png")

しばらく進み、次の画面ではMenu Commandを選択します。
![menucommand.png](https://qiita-image-store.s3.amazonaws.com/0/10494/6e7193bc-398e-d8b6-7bb8-b31fbe58943a.png "menucommand.png")

最後にここでは
Command Nameは、「Auto Command」
Command ID  は、「cmdidAutoBuild」
にしときます。

## UIに部品を追加

以下の要領で追加していきます。

1. \<IDSymbol\>追加する
2. \<Menu\>を追加して、typeに追加したいUIを指定する
3. \<Group\>を追加する
4. \<Button\>の配置場所を記述する

この記事の場合は、ツールバーを追加します。

まさに[ここ](https://msdn.microsoft.com/ja-jp/library/bb164715.aspx)に記述されている通りです。

```VSAutoBuild.vsct``` を開きます。(vsctについては[ここ](https://msdn.microsoft.com/en-us/library/ee909551.aspx)を参考にしてください。)

以下のように\<IDSymbol\>を追加します。
ここで定義した```name``` を```vsct``` ファイルの```guid``` や```id``` で利用します。
guidとidセットで一意になるので、利用するときも両方指定します。

```
<Symbols>
  <GuidSymbol name="guidVSAutoBuildCmdSet" ...
    <IDSymbol name="Toolbar" value="0x1000" />
    <IDSymbol name="ToolbarGroup" value="0x1050" />
```

以下のように\<Menu\>を追加します。
ツールバーを表示したいので```type``` を```Toolbar```にします。
ちなみに```type``` に指定するものは、```Menu```,```Context```,```Button```,```Toolbar``` です。

\<CommandFlag\>についての詳細は[ここ](https://msdn.microsoft.com/en-us/library/bb491716.aspx)を参考にしてください。

```
<Menus>
  <Menu guid="guidVSAutoBuildCmdSet" id="Toolbar" type="Toolbar" >
    <CommandFlag>DefaultDocked</CommandFlag>
    <Strings>
      <ButtonText>Auto Build</ButtonText>
      <CommandName>Auto Build</CommandName>
    </Strings>
  </Menu>    
</Menus>
```

以下のように\<Group\>を追加します。

```
<Group guid="guidVSAutoBuildCmdSet" id="ToolbarGroup" priority="0x0000">
  <Parent guid="guidVSAutoBuildCmdSet" id="Toolbar"/>
</Group>
```

\<Button\>の\<Parent\>のidを```ToolbarGroup``` に変更します。
今回のツールバーではアイコンなしでテキストだけにしたいので、```TextOnly```　にします。

\<CommandFlag\>についての詳細は[ここ](https://msdn.microsoft.com/en-us/library/bb491716.aspx)を参考にしてください。

```
<Button guid="guidVSAutoBuildCmdSet" id="cmdidAutoBuild" priority="0x0100" type="Button">
  <Parent guid="guidVSAutoBuildCmdSet" id="ToolbarGroup" />
  <CommandFlag>TextOnly</CommandFlag>
  <Strings>
    <ButtonText>AutoBuild</ButtonText>
  </Strings>
</Button>
```

ちなみにtypeが例えば、```Menu``` のときにこの\<Button\>の\<Parent\>で配置場所を決められます。

例えば、以下のようにするとメニューの「ツール」の中に自作のメニューが表示されます。

```
<Group guid="guidVSAutoBuildCmdSet" id="MyMenuGroup" priority="0x0600">
  <Parent guid="guidSHLMainMenu" id="IDM_VS_MENU_TOOLS"/>
</Group>

<Button guid="guidVSAutoBuildCmdSet" id="cmdidAutoBuild" priority="0x0100" type="Button">
  <Parent guid="guidVSAutoBuildCmdSet" id="MyMenuGroup" />
```

上記の```IDM_VS_MENU_TOOLS``` は、VisualStudioのメニューのIDになります。
その他のIDについては、[ここ]([https://msdn.microsoft.com/en-us/library/cc826118.aspx)を参照してください。

ここまで実装すると、Debugモードで動作させて「実験用のインスタンス」でツールバーに表示されます。

詳しくは、この記事の下部にある「使い方」に記述していますが、簡単に書くと以下の手順です。

* ツールバーのところで右クリック
* AutoBuildがあるので選択
* するとツールバーに```AutoBuild```表示される


## 自動ビルド実装

デフォルトの実装で、```Initialize()``` メソッドにAutoBuildツールバーが押下されたときのCallBackが```MenuItemCallback``` として実装されています。

ここに自分の処理を追加していきます。
と言っても単純な処理で以下ですべてになります。

```VSAutoBuildPackage.cs
private DocumentEvents _documentEvents;

private void MenuItemCallback(object sender, EventArgs e)
{
    var myCommand = sender as OleMenuCommand;
    if (null != myCommand)
    {
        myCommand.Checked = !myCommand.Checked;
    }

    DTE2 dte = (DTE2)GetService(typeof(DTE));
    _documentEvents = dte.Events.DocumentEvents;
    if (myCommand.Checked)
    {
        _documentEvents.DocumentSaved += DocumentEvents_DocumentSaved;
    }
    else
    {
        _documentEvents.DocumentSaved -= DocumentEvents_DocumentSaved;
    }
}

private void DocumentEvents_DocumentSaved(Document document)
{
    document.DTE.ExecuteCommand("Build.BuildSelection", "");
}
```

ツールバーがチェック状態のときにドキュメントを保存したら動作するイベント(```DocumentEvents_DocumentSaved``` )を登録し、オフ状態であればイベントを削除しています。

```document.DTE.ExecuteCommand``` で動作させています。

# 使い方

## インストール

VisualStudioギャラリーで公開されています。
Visual Studioで「ツール」　→　「機能拡張と更新プログラム」　→　「オンライン」で「VSAutoBuild」で検索します。
それをダウンロード・インストールして再起動します。
![install.png](https://qiita-image-store.s3.amazonaws.com/0/10494/75345bef-5ed5-3a3d-1f61-b6a3939a0fcd.png "install.png")



## ツールバーを表示

ツールバーで右クリックして、Auto Buildを選択します。
![toolbar.png](https://qiita-image-store.s3.amazonaws.com/0/10494/d34ad07c-2ee0-f7b9-e193-887cd692d8f6.png "toolbar.png")

## Auto BuildをOn

ツールバーのAuto BuildをOnにする
![toolbaron.png](https://qiita-image-store.s3.amazonaws.com/0/10494/1ff6afed-9b95-9c27-7562-e46ed58860d6.png "toolbaron.png")

## アンインストール

Visual Studioで「ツール」　→　「機能拡張と更新プログラム」　→　「VSAutoBuild」でアンインストールできます。

## 保存

あとは普通に保存するたびにBuildされます。

# ソース

このソースはgithubに置いてあります。参考にしてください。
https://github.com/ko2ic/VSAutoBuild