Создание библиотеки для разных версий .NET

У меня есть библиотека, которую я использовал для создания различных версий .NET, выполнив командную строку следующим образом: msbuild x.csproj /p:TargetFrameworkVersion=v4.6.2 ... несколько раз с разными значениями свойства TargetFrameworkVersion. Теперь я хотел добавить в скрипт .NET 4.7.1. Сборка для 4.7.1 завершается успешно, но следующие сборки завершаются ошибкой с таким сообщением:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\NuGet\15.0\Microsoft.NuGet.targets(186,5): ошибка: ваш проект не ссылается на ".NETFramework, Version= фреймворк v4.6.2". Добавьте ссылку на ".NETFramework,Version=v4.6.2" в разделе "frameworks" вашего проекта.json, а затем повторно запустите восстановление NuGet. [x.csproj]

Я много искал это сообщение, но не смог найти каких-либо полезных решений, которые исправили бы мой скрипт сборки. Ближе всего к решению было это. Но удаление project.assets.json перед каждым msbuild не помогло. Видимо есть проблема с восстановлением пакетов NuGet для разных версий .NET. Не могли бы вы предложить решение.


person Valo    schedule 21.03.2018    source источник
comment
Кстати, а зачем вам вообще собирать разные версии .NET? В большинстве случаев компилировать следует для одной версии .NET Framework, а затем для других платформ (например, .NET Standard, Xamarin). Нет никакой реальной ценности в том, что вы делаете прямо сейчас.   -  person Lex Li    schedule 21.03.2018
comment
Вы пытались вручную удалить папки bin и obj этого проекта, а не просто очистить сборку?   -  person Leo Liu-MSFT    schedule 21.03.2018
comment
@Lex Li, потому что есть люди в старых .NET (например, 4.5), которые используют библиотеку, но я хотел бы двигаться вперед и быть в курсе последних событий.   -  person Valo    schedule 22.03.2018
comment
@Leo Liu, да, я пробовал, и эффект такой же, как при удалении только файла project.json: работает в 4.7.1 и не работает в более ранних версиях.   -  person Valo    schedule 22.03.2018
comment
Сборка, созданная для .NET Framework 4.5, может безупречно работать в более поздних версиях (если только вы действительно не хотите выполнять условную компиляцию для некоторых особых случаев).   -  person Lex Li    schedule 22.03.2018


Ответы (1)


Хорошо, в итоге я вручную добавил такую ​​строку <TargetFrameworkVersions>net452;net462;net471</TargetFrameworkVersions> в первый элемент PropertyGroup файла проекта. А затем изменить (не удалять) файл project.assets.json, добавив разделы для различных целевых версий .NET. Это утомительная работа, и я могу себе представить, что это становится головной болью для нескольких проектов со многими версиями. Я сохранил копию файла где-то в проекте и добавил его в репозиторий, чтобы, если он будет перегенерирован VS, я мог легко восстановить его.

Если вы можете придерживаться только одной версии (наименьшего общего знаменателя) - вам ничего из этого не нужно. Вот мой файл project.assets.json для проекта с очень простой структурой и минимальным количеством зависимостей, опубликованного в NuGet для .NET 4.5.2, 4.6.2 и 4.7.1. Будем надеяться, что команда VS найдет лучший способ сделать все это в будущем.

person Valo    schedule 22.03.2018
comment
Если кто-то может придумать лучшее решение - я буду признателен, опубликовав его здесь. - person Valo; 23.03.2018