如何使用 MSBuild 为 .NET 5 构建现有的 .NET 4 项目?
How to use MSBuild to build an existing .NET 4 project for .NET 5?
是否可以在不升级 VS 中的项目的情况下针对 .NET 5 SDK 构建为 .NET 4.x 创建的项目?
我有一个 .NET 4.7 库项目,我使用 msbuild 为 .NET 4.x 编译(这个问题很容易通过创建“Class 库 (.NET Framework)”项目重现对于 .NET 4.7)。
我想为 .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.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.0.100\Roslyn\Microsoft.CSharp.Core.targets(8,31): error MSB4086: ('$(TargetFrameworkIdentifier)' != '.NETStandard' OR '$(_TargetFrameworkVersionWithoutV)' < '2.1')". [H:\ClassLibrary1\ClassLibrary1.csproj]
那个好像要$(_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.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]
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.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]
NET 5
是 Net Core 的新发行版本,而不是 Net Framework.
和 NET 5
是new-sdk风格的项目,而你这边的net framework 4.7项目是非sdk风格的项目。
所以 你不能将新 sdk 样式项目的 属性 用于非 sdk 样式项目。参见 this document。
还有,新 sdk 风格的项目使用 TargetFramework
而非 sdk 风格的项目使用 TargetFrameworkVersion
。并且 .NET 5
应该与 TargetFramework
一起使用,但您的非 sdk 项目无法识别它。
解决方案
因此您应该将您的网络框架项目从 non-sdk
更改为 new-sdk
。
您可以创建一个新的 net core 项目,然后将其 xxx.csproj 文件更改为:
<TargetFramework>net47</TargetFramework>
然后将旧项目的内容迁移到新项目中,这意味着该项目是一个 new-sdk
风格的项目,带有 net 框架。
参见 Overview of porting from .NET Framework to .NET Core and also this document。
然后,可以用
dotnet msbuild /property:TargetFramework=net5.0
是否可以在不升级 VS 中的项目的情况下针对 .NET 5 SDK 构建为 .NET 4.x 创建的项目?
我有一个 .NET 4.7 库项目,我使用 msbuild 为 .NET 4.x 编译(这个问题很容易通过创建“Class 库 (.NET Framework)”项目重现对于 .NET 4.7)。
我想为 .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.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.0.100\Roslyn\Microsoft.CSharp.Core.targets(8,31): error MSB4086: ('$(TargetFrameworkIdentifier)' != '.NETStandard' OR '$(_TargetFrameworkVersionWithoutV)' < '2.1')". [H:\ClassLibrary1\ClassLibrary1.csproj]
那个好像要$(_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.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]
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.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]
NET 5
是 Net Core 的新发行版本,而不是 Net Framework.
和 NET 5
是new-sdk风格的项目,而你这边的net framework 4.7项目是非sdk风格的项目。
所以 你不能将新 sdk 样式项目的 属性 用于非 sdk 样式项目。参见 this document。
还有,新 sdk 风格的项目使用 TargetFramework
而非 sdk 风格的项目使用 TargetFrameworkVersion
。并且 .NET 5
应该与 TargetFramework
一起使用,但您的非 sdk 项目无法识别它。
解决方案
因此您应该将您的网络框架项目从 non-sdk
更改为 new-sdk
。
您可以创建一个新的 net core 项目,然后将其 xxx.csproj 文件更改为:
<TargetFramework>net47</TargetFramework>
然后将旧项目的内容迁移到新项目中,这意味着该项目是一个 new-sdk
风格的项目,带有 net 框架。
参见 Overview of porting from .NET Framework to .NET Core and also this document。
然后,可以用
dotnet msbuild /property:TargetFramework=net5.0