我正在编写一个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文件进行修改,以便以更易于访问的方式添加必要的信息)
答案 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一书很适合挖掘这种废话。