VisualStudio2008のアドイン作りに当たって砕けてみた3

懲りずにアドインいじり。


今度の目標は
開いているソースを含むプロジェクトのクラス一覧を表示する
です。
資料ないとか言っても

  1. それっぽい名前のインターフェース、メソッドを見つける
  2. MSDNで検索
  3. 上記二つを繰り返す

でやっていけばある程度動かせるもんは
作れることが今更ながらわかってきました。


その結果として書いたみたコード↓
前回、前々回の日記でも使ったnewControl_Clickを編集しています。


void newControl_Click(CommandBarButton Ctrl, ref bool CancelDefault)
{
EnvDTE.Document document = _applicationObject.ActiveDocument;
EnvDTE.Project project = document.ProjectItem.ContainingProject;
EnvDTE.Configuration config =
project.ConfigurationManager.ActiveConfiguration;

// =====================================================
// ビルド出力先のパスを取得して表示
// ================================
string currentAssemblyPath =
string.Format(@"{0}\{1}\{2}",
project.Properties.Item("FullPath").Value,
config.Properties.Item("OutputPath").Value,
project.Properties.Item("OutputFileName").Value);
MessageBox.Show(currentAssemblyPath);

// =====================================================
// アセンブリのロード
// ==================
Assembly currentAssembly = Assembly.LoadFrom(currentAssemblyPath);

// =====================================================
// クラス一覧の表示
// ================
StringBuilder builder = new StringBuilder();
foreach (Type type in currentAssembly.GetTypes())
{
builder.AppendLine(type.FullName);
}
MessageBox.Show(builder.ToString());
}

上記コード(※)のうち
project」にはプロジェクト一般の情報が、
config」にはプロジェクトのプロパティなどで設定するような
ビルド構成依存の情報が入っています。


※例外処理は省略しています。
また、実行するとビルド先のファイルをつかんだままになってしまうため、
コンパイルなどで上書きができなくなってしまいます。
実用アドインを作る上でこのような処理を行いたい場合は
別の手段が必要です。


これを↓のような構成のプロジェクト上で実行してみます。



右側がファイル構成、左側がクラスの一つProgramクラスの中身です。



実行するとまず今開いているファイルが含まれる

プロジェクトのビルド出力先パスが表示され、

次に↓のようなクラス一覧が表示されます。