的MSBuild得到ProjectReference集引用(MSBuild get assembly

2019-08-01 03:32发布

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

这是简单的组装引用(获得<参考>所有项目),但它对于其他项目的引用变得更难(<ProjectReference>)

确实的MSBuild提供一种方法来从一个<ProjectReference>检索编译集引用?

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

所述的.csproj文件并不直接提供编译的程序集路径,它必须从其他属性重建。 此外,某些属性是有条件的(根据调试/发布配置),因此,使用一个简单的XPath阅读器将不能正常工作:

DLL文件名可以从<的AssemblyName>获得,但其中的DLL文件被写入的路径是在

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

有没有一种方法以编程方式读取.csproj的文件,并评估所有条件解决OutputPath正确的值?

我需要一个解决方案,其中引用的.csproj文件保持平原旧的项目文件(没有修改到的csproj文件,将在一个更方便的方式添加必要的信息)

Answer 1:

你可以把这样的:

<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把输出)。

内部的MSBuild引擎本书是伟大的挖掘到这一类的废话。



文章来源: MSBuild get assembly reference from ProjectReference
标签: msbuild