MSBuild从ProjectReference获取程序集引用

cka*_*ras 6 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>
Run Code Online (Sandbox Code Playgroud)

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

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

Rub*_*ink 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" />
Run Code Online (Sandbox Code Playgroud)

进入你的项目并像这样调用它:

 <Target Name="AfterCompile" DependsOnTargets="CopyDllsFromDependentProjects" />
Run Code Online (Sandbox Code Playgroud)

加入调味料.

这涉及MSBuilding依赖摸出输出(该信息不能静态地导出由于其中夹杂在MSBuild的处理方式 - 例如,哪来TeamBuild把输出).

Inside the MSBuild Engine一书非常适合挖掘这种废话.