我正在编写一个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文件,以更易于访问的方式添加必要的信息)
你可以把这样的东西:
<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一书非常适合挖掘这种废话.
| 归档时间: |
|
| 查看次数: |
4131 次 |
| 最近记录: |