2009-08-13 93 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内部的书很适合挖掘这种废话。