gpt4 book ai didi

MSBuild 从 ProjectReference 获取程序集引用

转载 作者:行者123 更新时间:2023-12-02 12:02:06 27 4
gpt4 key购买 nike

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

这对于程序集引用来说很简单(获取 中的所有项目),但对于引用其他项目 ( ) 则变得更困难

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

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

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

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

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

有没有办法以编程方式读取 .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" />

根据口味添加调味料。

这涉及 MSBuilding 依赖项来计算输出(由于 MSBuild 中处理包含内容的方式,无法静态导出信息 - 例如,TeamBuild 将输出放在哪里?)。

《Inside the MSBuild Engine》一书非常适合深入研究此类废话。

关于MSBuild 从 ProjectReference 获取程序集引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1272499/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com