如何使用 MSBuild 为 .NET 5 构建现有的 .NET 4 项目?

Jim*_*ica -2 msbuild visual-studio .net-core

是否可以根据 .NET 5 SDK msbuild 为 .NET 4.x 创建的项目,而无需在 VS 中升级该项目?

我有一个 .NET 4.7 库项目,我使用 msbuild 为 .NET 4.x 编译(并且通过为 .NET 4.7 创建“类库(.NET Framework)”项目可以轻松重现此问题)。

我想为 .NET 5 构建它,所以我尝试了

dotnet msbuild /property:TargetFrameworkVersion=net5.0 /property:TargetFrameworkIdentifier=.NETCoreApp



Microsoft (R) Build Engine version 16.8.0+126527ff1 for .NET
Copyright (C) Microsoft Corporation. All rights reserved.

C:\Program Files\dotnet\sdk\5.0.100\Roslyn\Microsoft.CSharp.Core.targets(8,31): error MSB4086: A numeric comparison was attempted on "$(_TargetFrameworkVersionWithoutV)" that evaluates to "" instead of a number, in condition "('$(TargetFrameworkIdentifier)' != '.NETCoreApp' OR '$(_TargetFrameworkVersionWithoutV)' < '3.0') AND [H:\ClassLibrary1\ClassLibrary1.csproj]
C:\Program Files\dotnet\sdk\5.0.100\Roslyn\Microsoft.CSharp.Core.targets(8,31): error MSB4086:                                          ('$(TargetFrameworkIdentifier)' != '.NETStandard' OR '$(_TargetFrameworkVersionWithoutV)' < '2.1')". [H:\ClassLibrary1\ClassLibrary1.csproj]
Run Code Online (Sandbox Code Playgroud)

那似乎想要$(_TargetFrameworkVersionWithoutV)所以我尝试了

dotnet msbuild /property:TargetFrameworkVersion=net5.0 /property:TargetFrameworkIdentifier=.NETCoreApp  /property:_TargetFrameworkVersionWithoutV=5.0
Microsoft (R) Build Engine version 16.8.0+126527ff1 for .NET
Copyright (C) Microsoft Corporation. All rights reserved.

C:\Program Files\dotnet\sdk\5.0.100\Microsoft.Common.CurrentVersion.targets(84,5): error MSB4184: The expression "[Microsoft.Build.Utilities.ToolLocationHelper]::GetPathToStandardLibraries(.NETCoreApp, net5.0, '', '', '', '')" cannot be evaluated. Input string was not in a correct format. [H:\ClassLibrary1\ClassLibrary1.csproj]
Run Code Online (Sandbox Code Playgroud)

PS:我也尝试将纯 .NET 5 库项目与 .NET 4 库项目进行比较,并在此基础上尝试了这一点

dotnet msbuild /property:TargetFramework=net5.0 /property:TargetFrameworkIdentifier=.NETCoreApp  /property:_TargetFrameworkVersionWithoutV=5.0 /property:TargetFrameworkVersion=5.0
Microsoft (R) Build Engine version 16.8.0+126527ff1 for .NET
Copyright (C) Microsoft Corporation. All rights reserved.

C:\Program Files\dotnet\sdk\5.0.100\Microsoft.Common.CurrentVersion.targets(1180,5): error MSB3644: The reference assemblies for .NETCoreApp,Version=v5.0 were not found. To resolve this, install the Developer Pack (SDK/Targeting Pack) for this framework version or retarget your application. You can download .NET Framework Developer Packs at https://aka.ms/msbuild/developerpacks [H:\ClassLibrary1\ClassLibrary1.csproj]
Run Code Online (Sandbox Code Playgroud)

Mr *_*ian 5

NET 5是Net Core而不是Net Framework的新发行版本。

请参阅此文档

在此输入图像描述

并且 NET 5是针对new-sdk风格的项目,而你这边的net Framework 4.7项目是非sdk风格的项目。

因此,您不能将 new-sdk 样式项目的属性用于非 sdk 样式项目。请参阅此文档

另外,new-sdk 风格的项目使用,TargetFramework而非 sdk 风格的项目使用TargetFrameworkVersion。并且.NET 5应该与TargetFramework您的非 sdk 项目一起使用但无法识别它。

解决方案

所以你应该将你的网络框架项目non-sdknew-sdk.

您可以创建一个新的 net core 项目,然后将其 xxx.csproj 文件更改为:

<TargetFramework>net47</TargetFramework>
Run Code Online (Sandbox Code Playgroud)

然后将旧项目的内容迁移到新项目中,这意味着该项目是一个new-sdk带有.net框架的风格项目。

请参阅从 .NET Framework 移植到 .NET Core 的概述以及本文档

然后,您可以使用

dotnet msbuild /property:TargetFramework=net5.0