使用 Directory.Build.Props 更改 .NetFramework 项目上的 TargetFrameworkVersion 意外影响 .NetStandard 项目

Mos*_*ndi 1 msbuild visual-studio

我正在尝试使用 Directory.Build.props 文件将一堆项目的 TargetFrameworkVersion 从 v4.6.1 更改为 v4.8。
我在 Directory.Build.props 文件下有 .net 框架和 .net 标准项目的组合,我想在更新时忽略 .net 标准项目。
对于 .net 框架项目,一切都按预期工作但是,条件"'$(TargetFramework.Contains(netstandard))' == 'false'"相反!对于 .net 标准的。
换句话说,为这个项目添加了属性并且构建失败,而它不应该。

MyClassLibrary.csproj

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

目录.Build.props

<?xml version="1.0" encoding="utf-8"?>
<Project>
    <PropertyGroup Condition="'$(TargetFramework.Contains(netstandard))' == 'false'">
        <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
    </PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

怎么会错?

Mr *_*ian 6

正如本文档所说,Directory.Build.props在 MSBuild 期间很早就导入了,这意味着它将先执行文件的内容,然后再从xxx.csproj项目中的文件中读取所有属性。

并且Directory.Build.targetsxxx.csproj文件末尾导入,因此它可以覆盖属性。

Directory.Build.props通常用于创建全局属性,而Directory.Build.targets用于覆盖属性。

================================================== ========================

对于Net Framework项目,

在您的问题MSBuild的第一读取性能TargetFrameworkVersion 4.8Directory.Build.props事实上也是如此。

项目TargetFramework中不存在该属性net framework它是新sdk项目的属性),所以值为,条件总是flase这样,条件成立。(flase=false)。

然后,MSBuild 读取xxx.csproj,它将读取属性TargetFrameworkVersion 4.6.1然后覆盖该属性4.8。因此它将始终使用 value 4.6.1

================================================== ========================

对于Net Standard项目,属性TargetFrameworkxxx.csproj文件下定义。当您第一次阅读内容并在Directory.Build.props文件中使用它时。

因为文件在读取之前运行xxx.csprojTargetFramework属性还没有定义,所以条件是falsefalse=false导致条件的建立。TargetFrameworkVersion 4.8当 net 标准项目使用 property 时,它将读取property TargetFramework

TargetFrameworkVersion设置为net framework 4.8而在网络标准项目中,该值通常是v2.0v2.1net standard 2.0net standard 2.1),它不能读net framework 4.8入网络标准项目。并且后续xxx.csproj文件没有值可以覆盖TargetFrameworkVersion为正常值net standard

因此作为 的值TargetFrameworkVersion嵌入到net standard项目中net framework,因此由于不兼容而导致构建失败。

解决方案

相反,您应该将Directory.Build.props文件重命名为Directory.Build.targets.

然后,重新启动您的项目,重建您的解决方案以启用它。它可以在我身边很好地工作。

请注意:尽管您右键单击项目属性-->应用程序-->目标框架显示旧的net framework 4.6.1,但MSBuild已将其设置为net48.

在此处输入图片说明

只是UI显示问题,没关系,可以无视。

  • 请不要发布文字图片。您可以轻松复制并粘贴该控制台输出。 (4认同)