TFS のビルドは、DLL参照のパスまで考慮してくれる!

試してみて感動した!
どういう構成かというと、次の様な2つのソリューションがあって

TFSBuildTestSuplerClass.sln
-TFSBuildTestSuplerClass.csproj
--親クラス.cs

TFSBuildChildClass.sln
-TFSBuildChildClass.csproj
--program.cs
--子クラス.cs

TFSBuildChildClass.子クラス は TFSBuildTestSuplerClass.親クラス を継承しています。そのため、TFSBuildChildClass.csproj は TFSBuildTestSuplerClass のアセンブリを参照する必要があります。
※新しくソリューション作って、TFSBuildTestSuplerClass.csproj と TFSBuildChildClass.csproj を含めて、プロジェクトに参照する っていう方法は使いません。(検証のため)
なので、TFSBuildChildClass.csproj は TFSBuildTestSuplerClass.csproj の出力フォルダにある dll を参照しています。

こんな構成の場合、.csproj では相対パスでファイルのパスが指定されます。

一部抜粋

<Reference Include="TFSBuildTestSuperClass">
  <HintPath>..\..\TFSBuildTestSuperClass\TFSBuildTestSuperClass\bin\Debug\TFSBuildTestSuperClass.dll</HintPath>
</Reference>

こういう場合って自動でビルドするのはちょっと制約が出来たりするんですね。例えば、ソース管理のディレクトリ構成が物理構成と同じ必要があるとか。
この場合、ソース管理上でも TFSBuildChildClass.csproj の2階層上に TFSBuildTestSuperClass ってフォルダがあって〜というようにしておかないと、TFSBuildTestSuperClass .dll のファイルコピー処理を挟んだりしないと dll が存在しませんみたいなエラーになります。


ところが TFS のビルドでビルドすると、ディレクトリ構成とか気にせずビルド出来ちゃうんです!すっげ〜。
ソース管理上はこんな構成。(わざと階層をずらしています。)

これを、ビルドの構成で TFSBuildTestSuplerClass.sln の次に TFSBuildChildClass.sln をビルドする様に設定します。

んで、ビルドの実行を行うと

成功するんですね〜。どうなってるのか TFSBuildChildClass のビルドログを少し確認してみると…

〜 部分は長いので省略しています。

CoreCompile:
  C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Csc.exe 〜 /reference:C:\Builds\1\ToDo\TFSBuildTest\Binaries\TFSBuildTestSuperClass.dll 〜

TFSBuildTestSuperClass.dll のパスが良く分からない場所になってます。
Visual Studio から実行した場合は、

〜 部分は長いので省略しています。

  C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe 〜 /reference:"C:\Users\user\Documents\Visual Studio 2010\Projects\TFSBuildTestSuperClass\TFSBuildTestSuperClass\bin\Debug\TFSBuildTestSuperClass.dll" 〜

となっています。
Visual Studio から ビルドログの詳細を確認するには、メニュー -> ツール -> オプション -> プロジェクトおよびソリューション -> ビルド/実行 から変更出来ます。


TFS でビルドすると参照パスが自動的に変更されていますね〜。すごいな〜、どういう理屈で変更されてんだろ?


こんなの書きましたが、プロジェクト参照を使用するのがベストだと思っています。
また、DLL 参照する場合でも出力フォルダを直接参照するのではなく、どこか別のフォルダ(参照する側のソリューション/プロジェクトに含める等)に配置して参照するのが良いのかなと思います。

※別のフォルダに配置した場合 DLL が変更されると、コピーする手間が発生しますがビルド後のイベントか何かでコピー(or ソース管理のファイルを変更)してやれば良いだけですし、頻繁に変更するならプロジェクトの参照にする方が何かと便利な気がしますね〜。