Visual Studio 2015 を使用した VSPackage の作成について
こんにちは、Visual Studio サポート チームです。
今回は Visual Studio 2015 を使用して、Visual Studio の拡張機能 (VSPackage) を作成する方法についてご紹介します。
Visual Studio の拡張について
Visual Studio の機能を拡張する方法としては、以前は Visual Studio アドイン形式がありましたが、アドイン形式は Visual Studio 2013 で使用できなくなりました。Visual Studio 2013 以降のバージョンでは、機能を拡張する際には VSPackage 拡張機能をご使用ください。
VSPackage は、Visual Studio 2010 以降で作成することが可能であり、新規作成時にはウィザード形式で基本的な構成を作成することが可能でした。
しかし、Visual Studio 2015 では、これらウィザードが無くなり、必要な構成を追加しながら作成を進める方式に変更されました。
以下では、Visual Studio 2015 を使用して VSPackage 拡張を作成する手順をご案内します。
VSPackage プロジェクトの作成
Visual Studio の拡張機能を使用するためには、Visual Studio SDK が必要になります。
Visual Studio 2015 SDK のインストールや機能などについては、以下の MSDN ドキュメントをご参照ください。
Visual Studio SDK
https://msdn.microsoft.com/en-us/library/bb166441.aspx
Visual Studio 2015 で VSPackage を新規に作成する場合は、[新しいプロジェクト] ダイアログで、任意の言語を選択し、[Extensibility] にある [VSIX Project] を選択します。
VSIX Project を作成すると、VSPackage のインストール動作を設定する際に必要となるファイル (VSIX パッケージ マニフェスト ファイル : vsixmanifest) が含まれたプロジェクトが生成されます。
この状態でもビルド、デバッグ実行は可能です。デバッグ実行するとデバック用の Visual Studio (実験的なインスタンス) が起動します。しかし、まだ拡張機能は実装されていませんので、メニューも機能も何も追加されていません。
まずはメニューを追加してみます。
メニューを追加する
メニューを追加するには、ソリューション エクスプローラでプロジェクトを右クリックし、メニューから [追加] – [新しい項目] をクリックします。
[新しい項目の追加] ダイアログの左にあるツリーで “Extensibility” を選択し、”Custom Command” を選択、追加します。
Custom Command を追加すると、VSPackage の定義を記載するコマンド テーブル構成ファイル (*.vsct) やメニューの処理を記載する CS ファイルなどが追加されます。
まずはこれらのファイルから、*.vsct ファイルを開き、内容を確認してみてください。
VSCT ファイルは XML で記載されており、この定義を基に VSPackage ではメニューやウィンドウなどの UI 要素を作成しています。WPF アプリケーションにおける XAML ファイルのような位置づけのファイルです。
VSCT ファイルの内容や XML スキーマについては、以下の MSDN ドキュメントをご参照ください。
Visual Studio のコマンド (テーブル。Vsct) ファイル
https://msdn.microsoft.com/ja-jp/library/bb164699.aspx
内容はともかく、まずはこのままビルドし、デバッグ実行してみます。
Visual Studio (実験的なインスタンス) が起動したら、[ツール] メニューを開いてみると、”Invoke Command1” が追加されていることを確認できます。無事、メニュー コマンドを追加することができました。
”Invoke Command1” メニューをクリックすると、メッセージ ボックスが表示されます。
このメッセージ ボックスは、追加された CS ファイル内に記載されたコールバック メソッド内に記載されている処理です。
メニューが追加される位置の指定方法は?
動作確認の通り、テンプレートから Custom Command を追加した場合、[ツール] メニュー内に追加されました。この追加する位置は、VSCT ファイル内に記述されています。
VSCT ファイルを開くと、以下のような定義があります。
(一部のコメントは削除しています)
---
<Groups>
<Group guid="guidCommand1PackageCmdSet" id="MyMenuGroup" priority="0x0600">
<Parent guid="guidSHLMainMenu" id="IDM_VS_MENU_TOOLS"/>
</Group>
</Groups>
<!--Buttons section. –>
<Buttons>
<Button guid="guidCommand1PackageCmdSet" id="Command1Id" priority="0x0100" type="Button">
<Parent guid="guidCommand1PackageCmdSet" id="MyMenuGroup" />
<Icon guid="guidImages" id="bmpPic1" />
<Strings>
<ButtonText>Invoke Command1</ButtonText>
</Strings>
</Button>
</Buttons>
---
この定義で使用されている Groups 要素や Buttons 要素については、以下の MSDN ドキュメントをご参照ください。
Groups 要素
https://msdn.microsoft.com/ja-jp/library/bb165798.aspx
Buttons 要素
https://msdn.microsoft.com/ja-jp/library/bb166194.aspx
Custom Command (メニュー) は、Button 要素として定義され、その親 (Parent) として Group の GUID が指定されています。
また、Group の Parent では、GUID が “guidSHLMainMenu”、ID が "IDM_VS_MENU_TOOLS" と指定されています。
この “guidSHLMainMenu” や "IDM_VS_MENU_TOOLS" は、Visual Studio に既定で設定されているメニューです。
Visual Studio の既定のメニューなどの ID は、以下の MSDN ドキュメントをご参照ください。
GUIDs and IDs of Visual Studio Menus
https://msdn.microsoft.com/en-us/library/cc826118.aspx
VSCT ファイルで任意の GUID、ID を指定することで、任意の位置にメニューを追加することが可能です。
また、priority の値が小さいほど、より上に表示されます。メニュー内の表示位置を調整する際には、priority の値を変更してみてください。
メニューをクリックしたときの処理は?
メニューをクリックした際の処理など、実際の処理は CS ファイルに記載されています。
VSPackage が有効化された場合、まずは Initialize メソッドが呼び出されます。
通常、Initialize メソッドでは、各メニューなどに対するコールバック メソッドを登録します。
メニューをクリックされた場合など、発生したイベントに合わせて登録されたコールバックメソッドが呼び出される仕組みとなっています。
まとめ
Visual Studio 2015 で VSPackage 拡張を作成する手順は以下のようなイメージになります。
- お好みの言語で VSIX プロジェクトを作成する
- プロジェクトに Custom Command (メニュー) や Custom Tool Window などを追加する
- メニューやウィンドウの UI は、VSCT ファイルで定義する
- メニューをクリックした際の動作などはコールバックメソッドを作成し、処理を行う
- 任意のメニューやウィンドウができたら、 2. に戻り必要なものを作成する
- 完成したらビルドし、VSIX ファイルを配布する
本 Blog では、まずはプロジェクトの作成やメニューの追加を行いました。
実際の処理では、Visual Studio オートメーション オブジェクト (DTE) などを使用して Visual Studio の機能を使ったり、任意の処理を行ったりすることになります。
VSPackage 拡張でどのようなことができるのかについては、Visual Studio の [ツール] – [拡張機能と更新プログラム] をクリックし、”Visual Studio ギャラリー” から世界中の開発者の皆様が作成されたすばらしい拡張機能をインストールし、使用していただくことで確認することができます。
まずは気になる拡張パッケージをインストールし、どのような機能が実現できるのかなどお試しください。
VSPackage を作成する上での手順や Tips などは、今後も本 Blog で公開していく方針ですので、是非、皆様も一度作成してみていただければ幸いです。