VS2005プロジェクトテンプレートの参照設定

プロジェクトテンプレートの参照設定について、検証しました。

プロジェクトから参照するdllの情報をプロジェクトテンプレートに残す方法

Winアプリプロジェクト
  • プロジェクトファイルにdll参照パスの設定があればよい。
  • プロジェクトにdllへの参照を追加すると、デフォルトでは(プロパティのローカルコピーがTrueなので)ビルド時にdllをbinにコピーしてくる。また、参照に追加したdllが参照するdllもコピーしてくる。
  • テンプレートのエクスポート時に、binフォルダの内容は無視される。テンプレートにdllは含まれない。
Webサイト
  • Binにdll.refreshファイルがあればよい。テンプレート作成時にdll本体は不要。
  • Webサイトにdllへの参照を追加すると、dllをBinにコピーしてくる。また、参照に追加したdllが参照するdllもコピーしてくる。
  • Webサイトの場合は、dll本体がBinにある状態でテンプレートを作成すると、テンプレートにdllも入ってしまう。
  • dllを削除した状態でテンプレートを作成すると、テンプレートにdllは入らない。*1

プロジェクトテンプレート作成時の注意点

プロジェクトテンプレート作成時、参照するdllが置いてあるドライブ(今回はCとする)と同じドライブで作業を行ってはいけない(プロジェクト/Webサイト双方)

プロジェクトと同じドライブにあるdllを参照すると、Webサイトでは相対パスで参照設定(Binフォルダに相対パスが記載された.refreshファイルが作成)されます。
そのままプロジェクトをテンプレート化すると、参照設定が相対パスとなるため、テンプレートを用いて、Cドライブ以外に作成したプロジェクトは、dllが見つからない状態となります(Cドライブに作っても、階層が深くなると見つからない状態となります)。
Webサイト以外のプロジェクトでも、相対パスで参照設定(プロジェクトファイルにdllの相対パスが記載)されます。その後は同様にdllが見つからない状態となります。

回避策

参照するdllのあるドライブとは別のドライブに、雛形となるプロジェクトを作成して作業する。

ドライブが1つしかない場合には、DOS窓でSUBSTコマンドを使って、仮想ドライブを割り当てる方法で作業できそうです。

    SUBST [ドライブレター]: [パス]
例) SUBST E: C:\Edrive

*1:ここで面倒なのは、ソリューションエクスプローラからdllを削除すると、.refreshファイルも一緒に削除されてしまうことです。そこで、エクスプローラでBinフォルダを開いて、dllファイルを直接削除し、ソリューションエクスプローラで表示を「最新の情報に更新」してから、プロジェクトテンプレートをエクスポートします。そうすると、作成されたプロジェクトテンプレートにはdll本体が入らずに、ビルドをしたときに参照先から取得するようになります。