だらだらやるよ。

こげつのIT技術メモ

VisualStudioのアドイン作ってみた。

といってもまだやりたいことはできず。できたとこまでメモ
MSDNをうろうろしながらVS2008Proで作成中。

VisualStudioアドインプロジェクトの作成

  • 新しいプロジェクトから、その他のプロジェクトの種類→機能拡張→VisualStudioアドインプロジェクトを選択。
  • ウィザードが立ち上がるので、言語、アプリケーションホストを選択、アプリケーション名を入力
  • アドインオプションの選択、初期値だとVSの起動と同時に実行されてしまうので、アドイン用のコマンドバーUIを作成しますか?にチェック
  • バージョン情報ダイアログを設定するかどうかのチェックをして完了

色々なファイルが自動的にプロジェクトに作られました。
あとはConnectクラスのExecメソッドを触っていくのです。メニューを階層化したい場合はOnConnectでごにょごにょやる必要があるのかな?

アドインからフォームを表示

プロジェクトにフォームを追加するだけです。
Execからnewしたら普通に表示できます。
_applicationObjectが必要なので、プロパティ追加して、参照も一緒に渡しました。

public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)
{
	handled = false;
	if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
	{
		if(commandName == "TestAddin.Connect.TestAddin")
		{
			MainForm mf = new MainForm() { ApplicationObject = _applicationObject };
			mf.ShowDialog();
			handled = true;
			return;
		}
	}
}

プロジェクトの一覧を取得

ここからはとりあえずフォームにべたべた書いていきます。

今開いてるプロジェクトの一覧が欲しいのでこんな感じでぐるぐると
リストボックスに今開いてるソリューションに追加されているプロジェクトの一覧を表示しています。

for(int i = 1;i <= _applicationObject.Solution.Projects.Count;i++) {
	listBox1.Items.Add(_applicationObject.Solution.Projects.Item(i).Name);
}

選択したプロジェクトにクラスファイルを追加する

で、とりあえずこんなメソッドを作って

private Project SelectedProject() {
	foreach(Project p in _applicationObject.Solution.Projects) {
		if(listBox1.SelectedItem.ToString() == p.Name) {
			return p;
		}
	}
	return null;
}

追加するクラス用のディレクトリを作成

そのままプロジェクトにクラス追加してもいいのですが、名前の衝突とかあったらめんどくさいので
ディレクトリを一個掘ることにします。

string createDirectoryName = "Test";
Project p = SelectedProject();
String path = Path.GetDirectoryName(p.FileName);
if(!Directory.Exists(path + "\\" + createDirectoryName)) {
	p.ProjectItems.AddFolder(createDirectoryName,null);
}	

ディレクトリにクラスファイルを追加

ここからはあまり理解できないのですよね。。。
とりあえず以下のように書いて、C#のクラス用テンプレートから、クラスファイルをプロジェクトに追加できました。
ソリューションからテンプレートを取得するのがどうもよくわかってません。

ProjectItem dir = p.ProjectItems.Item(createDirectoryName);
Solution2 sl = (Solution2)_applicationObject.Solution;
string templatepath = sl.GetProjectItemTemplate("Class","CSharp");
dir.ProjectItems.AddFromTemplate(templatepath,"TestClass.cs");

これから

追加したクラスに動的にメソッドやらプロパティを追加していかなきゃいけないのですよね
さてさてどうなることやら?