2009-08-13 13 views
6

標準のC#プロジェクト(.csproj)にコード生成を追加するMSBuildタスクを作成しています。タスクは、そのプロジェクトが参照するアセンブリ内の型にアクセスする必要があります。MSBuildからProjectReferenceアセンブリリファレンスを取得

これは、アセンブリ参照のために簡単です(<参考>内のすべてのアイテムを取得)、それは他のプロジェクト(<ProjectReference>)への参照のために困難になる

のMSBuildからコンパイル済みのアセンブリ参照を取得する方法を提供していますa <ProjectReference>?

もしそうでなければ、.csprojファイルを読むことでその名前を解決する簡単な方法はありますか?

.csprojファイルは、コンパイルされたアセンブリパスを直接提供するものではなく、他のプロパティから再構築する必要があります。また、いくつかのプロパティは条件付きです(Debug/Releaseの設定によって異なります)ので、単純なXPathリーダーを使用しても動作しません。

<AssemblyName>からDllファイル名を取得できますが、Dllファイル

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> 
    <OutputPath>;bin\Release</OutputPath> 
<PropertyGroup> 

プログラムで.csprojファイルを読み込み、すべての条件を評価することにより、OutputPathの正しい値を解決する方法はあり

で書かれているのでしょうか?

私はあなたが好きなものを入れることができ.csproj参照されるファイルは、(よりアクセス可能な方法で必要な情報を追加するcsprojファイルへの変更)、昔ながらのプロジェクトファイル残っていないソリューション

答えて

6

が必要になります。

<Target Name="CopyDllsFromDependentProjects"> 
<MSBuild Projects="@(ProjectReference)" Targets="Build" BuildInParallel="true" Condition="'%(Name)'=='ProjectA' Or '%(Name)'=='ProjectB'"> 
    <Output TaskParameter="TargetOutputs" ItemName="OutputAssemblies" /> 
</MSBuild> 
<Copy SourceFiles="@(OutputAssemblies)" DestinationFolder="$(PostBuildDir)" SkipUnchangedFiles="true" /> 

プロジェクトにで

とこのようにそれを呼び出す:

<Target Name="AfterCompile" DependsOnTargets="CopyDllsFromDependentProjects" /> 

味にシーズニングを追加します。

これは、出力を処理するために依存関係をMSBuildすることを含みます(MSBuildで包含物が処理されるために情報が静的に導出されます - たとえば、TeamBuildは出力をどこに置くのですか?)。

「Inside the MSBuild Engine」の本は、この種のナンセンスを掘り下げるのに最適です。

関連する問題