MSBuild从ProjectReference获取程序集引用

时间:2009-08-13 14:55:00

标签: msbuild

我正在编写一个MSBuild任务,它将一些代码生成添加到标准C#项目(.csproj)。该任务需要访问该项目引用的程序集中的类型。

这对于程序集引用很简单(获取< Reference>中的所有项目),但是对其他项目的引用变得更加困难(< ProjectReference>)

MSBuild是否提供了从< ProjectReference>中检索已编译程序集引用的方法?

如果没有,是否有一种简单的方法可以通过读取.csproj文件来解析该名称?

.csproj文件不直接提供编译的程序集路径,必须从其他属性重建。此外,一些属性是有条件的(取决于调试/发布配置),因此使用简单的XPath读取器将无法工作:

可以从< AssemblyName>获取Dll文件名,但是写入Dll文件的路径在

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

有没有办法以编程方式读取.csproj文件并通过评估所有条件来解析OutputPath的正确值?

我需要一个解决方案,其中引用的.csproj文件仍然是普通的旧项目文件(不对csproj文件进行修改,以便以更易于访问的方式添加必要的信息)

1 个答案:

答案 0 :(得分:7)

您可以输入类似的内容:

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

添加调味料。

这涉及MSBuilding依赖关系来计算输出(由于在MSBuild中处理包含的方式,信息不能静态导出 - 例如,TeamBuild将输出放在哪里?)。

The Inside the MSBuild Engine一书很适合挖掘这种废话。