Как использовать MSBuild для создания существующего проекта .NET 4 для .NET 5?

#visual-studio #.net-core #msbuild

#visual-studio #.net-core #msbuild

Вопрос:

Возможно ли создать msbuild проект, созданный для .NET 4.x, с помощью .NET 5 SDK без обновления проекта в VS?

У меня есть проект библиотеки .NET 4.7, который я компилирую для .NET 4.x с помощью msbuild (и эту проблему легко воспроизвести, создав проект «Библиотека классов (.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 Filesdotnetsdk5.0.100RoslynMicrosoft.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:ClassLibrary1ClassLibrary1.csproj]
C:Program Filesdotnetsdk5.0.100RoslynMicrosoft.CSharp.Core.targets(8,31): error MSB4086:                                          ('$(TargetFrameworkIdentifier)' != '.NETStandard' OR '$(_TargetFrameworkVersionWithoutV)' < '2.1')". [H:ClassLibrary1ClassLibrary1.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 Filesdotnetsdk5.0.100Microsoft.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:ClassLibrary1ClassLibrary1.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 Filesdotnetsdk5.0.100Microsoft.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:ClassLibrary1ClassLibrary1.csproj]
 

Комментарии:

1. Этот веб-сайт — для чего -1? Я приложил усилия, я думаю, что вопрос разумный.

2. docs.microsoft.com/en-us/dotnet/core/porting Вы должны переносить проекты вручную, и никакого ярлыка там нет. Направьте свои усилия в правильном направлении, пожалуйста. Здесь уже есть множество вопросов о миграции .NET Framework на .NET Core (и .NET 5 не отличается).

3. @LexLi Я вижу — похоже, я сделал предположение, основанное на имени «.NET 5», которое было скорее основой, чем ядром. Я понял, что столкнулся только с этой проблемой и ответами, и что перенос на core важен при переходе с .NET 4 на 5.

Ответ №1:

NET 5 это новая версия Net Core, а не Net Framework.

Смотрите этот документ:

введите описание изображения здесь

И NET 5 предназначен для нового проекта в стиле sdk, в то время как проект net framework 4.7 на вашей стороне не является проектом в стиле sdk.

Таким образом, вы не можете использовать свойство проекта в стиле нового sdk для проекта в стиле, отличном от sdk. Смотрите этот документ.

Кроме того, проекты в стиле нового sdk используются, в то TargetFramework время как проект в стиле, отличном от sdk TargetFrameworkVersion . И .NET 5 должен использоваться с TargetFramework , но ваш проект, не связанный с sdk, не идентифицирует его.

Решение

Поэтому вам следует изменить свой проект net framework с non-sdk into new-sdk .

Вы можете создать новый проект net core, а затем изменить его файл xxx.csproj на:

 <TargetFramework>net47</TargetFramework>
 

А затем перенесите содержимое вашего старого проекта в новый, что означает, что этот проект является new-sdk проектом стиля с net framework.

См. Обзор переноса с .NET Framework на .NET Core а также этот документ.

Затем вы можете использовать

dotnet msbuild /property:TargetFramework=net5.0