VisualStudioのアドインをつくろう。

# はじめに

* ふと仕事でプロジェクトの設定を場合によってゴニョゴニョしないといけなくて、VisualStudioのアドインがあったら捗るのになという案件があったので作り方を調べてみました。

* おそらく、VS2013でも作り方はほぼ一緒かと。VS2008で作ったものをそのまま使うことは出来ないみたい。

# 作り方
1. VisualStudio→ファイル→新規作成→プロジェクト→拡張機能→VisualStudioアドインをクリック
![Addin00.png](https://qiita-image-store.s3.amazonaws.com/0/31791/dbab9fcd-4170-5f17-1e82-579fd5976bc4.png)

2. アドイン作成ウィザードが開始されます(楽ちん！)
![Addin01.png](https://qiita-image-store.s3.amazonaws.com/0/31791/a1fe691e-9ad3-f9a4-6bea-5f6fa9f89876.png)


3. 言語を選びます。もちろん僕はC#以外は選びません( ´∀｀)
![Addin02.png](https://qiita-image-store.s3.amazonaws.com/0/31791/afb2b1c0-6464-72a7-dd9b-ca5e62141d28.png)


4. 何を言ってるかよくわかりませんがとりあえず全部選択します。
![Addin03.png](https://qiita-image-store.s3.amazonaws.com/0/31791/c511eaa1-6c0d-7a43-5cde-4e7c3f153e4c.png)

5. 出来た＼(^o^)／
![Addin05.png](https://qiita-image-store.s3.amazonaws.com/0/31791/8fe173b7-43b3-fcc4-7a54-11060dfa0ee1.png)

6. 後は、プログラムをガリガリ書いていくだけです。(えっ


# 簡単にデバッグ・作成の流れ
1. 作成したアドインを実行[ツール→(さっきつけたアドイン名)]してみると、新しいVisualStudioが開きます。
2. とりあえず、アドインのConnect.csのExecにブレークポイントを張ってアドインを実行してみると、Execが呼ばれるのが確認できる。他に、アドインが接続された時に呼ばれるOnConnectionやアンロードされた時のOnDisconnectionなどコールバックが幾つか用意されてる。
3. あとはいい感じにコードをガリガリ書いたら完成＼(^o^)／

## Formを作りたい場合
* 参照追加
![Addin06.png](https://qiita-image-store.s3.amazonaws.com/0/31791/bc60c372-0213-60e2-5e6e-1b67dac3b1d1.png)
![Addin07.png](https://qiita-image-store.s3.amazonaws.com/0/31791/ab946fc6-d237-f5f7-ee84-a36b6e7d929b.png)

* フォーム追加
![Addin08.png](https://qiita-image-store.s3.amazonaws.com/0/31791/f1e896a8-b8b2-e925-5053-9b2d1a9e3390.png)

* フォーム生成

```ruby:connetc.cs
using System.Windows.Forms;
namespace MyAddin1
{

	public class Connect : IDTExtensibility2, IDTCommandTarget
	{
		public Connect()
		{
		}

          
		public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)
		{
			handled = false;
			if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
			{
				if(commandName == "MyAddin1.Connect.MyAddin1")
				{
					handled = true;

					// フォーム生成・表示
					Form1 form = new Form1();
					form.Show();
					// プロジェクトの設定を弄りたいのでオブジェクトを渡しておく(Form1に関数追加)
					form.SetDTE(_applicationObject);

				
					return;
				}
			}
		}
		private DTE2 _applicationObject;
		private AddIn _addInInstance;

```

* アドインを実行したらこんな感じ。
![Addin09.png](https://qiita-image-store.s3.amazonaws.com/0/31791/ef5c5978-cd76-dce3-daac-53d94649017d.png)



## プロジェクト設定をアドインから変えてみる

```ruby:connetc.cs
        private void button1_Click(object sender, EventArgs e)
        {


			// スタートアッププロジェクトを取得
			SolutionBuild2 sb = (SolutionBuild2)_DTE.Solution.SolutionBuild;
			Project startupProj;
			string msg = "";

			foreach (String item in (Array)sb.StartupProjects)
			{
				msg += item;
			}
			startupProj = _DTE.Solution.Item(msg);
			
			Configuration activeConfiguration = startupProj.ConfigurationManager.ActiveConfiguration;


			// プロジェクトのコンフィグ取得
			EnvDTE.Properties configProps = activeConfiguration.Properties;

			// コンフィグ一覧を出力
			foreach (EnvDTE.Property p in configProps)
			{
				Debug.Print(p.Name);
			}

			// プロパティを変更してみる
			EnvDTE.Property prop;
			prop = configProps.Item("Command");
			prop.Value = "-window";

		}

```


## その他メモ
* プロジェクトファイルに依存しないVC固有の設定？はProjectオブジェクトをMicrosoft.VisualStudio.VCProjectEngineのVCProjectにキャストして辿らないといけないみたい。面倒。。。

* コマンドラインでも使えるアドインってのが作れるので、コマンドラインからのビルドしても使えそう？(調査中)

* アドインの配布
http://www.atmarkit.co.jp/fdotnet/special/vsaddinintro03/vsaddinintro03_01.html