2009-08-13 130 views
6

我正在寫一個MSBuild任務,它將一些代碼生成添加到標準C#項目(.csproj)中。該任務需要訪問該項目引用的程序集中的類型。MSBuild從ProjectReference獲取程序集引用

這是簡單的組裝引用(獲得所有項目的<參考>),但它對於其他項目的引用(<ProjectReference>)變得更難

是否的MSBuild提供了一種方法來檢索編譯的程序集引用a <ProjectReference>?

如果沒有,是否有一種簡單的方法通過讀取.csproj文件來解析該名稱?

該.csproj文件不會直接提供編譯的程序集路徑,它必須從其他屬性重建。此外,某些屬性是有條件的(根據調試/發佈配置),因此,使用一個簡單的XPath閱讀器將不能正常工作:

所在路徑的dll文件

dll文件名可以從<的AssemblyName >獲得,但寫在

<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" /> 

添加調味品。

這涉及MS建立依賴關係來計算輸出(由於MSBuild中處理包含物的方式(例如,TeamBuild將輸出位置在哪裏),靜態導出的信息無法得到)。

MSBuild Engine內部的書很適合挖掘這種廢話。