MSBuild从ProjectReference获取程序集引用

MSBuild从ProjectReference获取程序集引用,msbuild,Msbuild,我正在编写一个MSBuild任务,该任务向标准C#项目(.csproj)添加一些代码生成。任务需要访问该项目引用的程序集中的类型 这对于程序集引用(获取所有项)来说很简单,但是对于其他项目的引用() MSBuild是否提供了从中检索已编译程序集引用的方法 如果没有,是否有一种通过读取.csproj文件来解析该名称的简单方法 .csproj文件不直接提供编译的程序集路径,它必须从其他属性重建。此外,有些属性是有条件的(取决于调试/发布配置),因此使用简单的XPath读取器将无法工作: 可以从中获取

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

这对于程序集引用(获取所有项)来说很简单,但是对于其他项目的引用()

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

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

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

可以从中获取Dll文件名,但写入Dll文件的路径为

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

;bin\Release
是否有一种方法可以通过编程方式读取.csproj文件,并通过计算所有条件来解析OutputPath的正确值


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

您可以放置如下内容:

<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将输出放在哪里?)

《MSBuild引擎手册》中的这本书非常适合深入研究这类废话