Как построить решение для нескольких целевых фреймворков?
У нас есть библиотека классов, в настоящее время ориентирующаяся .NET 4.6.2
который имеет некоторые зависимости (классы SDK), которые разрешаются с помощью nuget.
Все SDK-сборки, требуемые этой библиотекой классов, доступны для нескольких целевых платформ (например, 4.6.2
, 4.5.2
так далее.).
Мы используем VSTS как для сборки библиотеки, так и для упаковки / отправки ее в частную ленту NuGet.
Теперь нам нужна наша библиотека классов для обеих целей .NET 4.5.2
так же как .NET 4.6.2
потому что у нас есть проект с использованием этой библиотеки ориентации .NET 4.5.2
(и нет, к сожалению, обновление его цели не вариант)
Итак, острый вопрос: есть ли способ создать решение для обеих целевых структур?
Что я пробовал до сих пор:
- много исследовал, но эта проблема, кажется, не является общей (или я просто не могу правильно настроить Google в этом конкретном случае)
- экспериментировал с переменными сборки, но это, похоже, тоже не сокращает
Я также подумал о каком-то скрипте для разбора и манипулирования всеми packages.config
а также *.csproj
файлы, но я думаю, что это совсем не лучшая практика.
2 ответа
Довольно просто иметь библиотеку сборок / классов, которую можно использовать в проектах, ориентированных на разные версии.Net Framework.
Если у вас есть проекты, нацеленные на 4.5.2 и 4.6.2, но вы хотите предоставить общую библиотеку, тогда выберите цель библиотеки 4.5.2. .Net make по существу обратно совместим, поэтому вы всегда можете использовать библиотеку, ориентированную на более низкую версию, чем версия, на которую нацелены библиотека / проект. Технически вы могли бы нацеливаться и на что-либо ниже этого, включая 3.5, но зачем вам
Это также относится и к.Net Core и.Net Standard, но комбинации быстро складываются. Если библиотека предназначена для.Net Standard 1.0, ее можно использовать в проектах, ориентированных на любую версию.Net Standard >= 1.0, любую версию.Net Core >= 1.0 и любую версию.Net Framework >= 4.5.2. Подробнее смотрите в документации по.Net Standard.
Более подробную информацию о.Net Standard можно найти в этом блоге Дэниела Крабтри.
На самом деле, да, это кажется возможным, но я никогда не видел никаких документов об этом, и я не пробовал это сам, пока. Я наткнулся только на проект с открытым исходным кодом, который использовал его, и мне показалось, что это возможно.
Это на самом деле довольно просто: вы должны вручную отредактировать *.csproj
файл следующим образом:
- Преобразуйте проект в новый формат стиля SDK, как если бы вы перенесли его в.NET Standard (корень документа должен быть
<Project Sdk="Microsoft.NET.Sdk">
) - Вместо
<TargetFramework>net452</Targetframework>
, просто напиши<TargetFrameworks>net452;net462</TargetFrameworks>
Если вы откроете страницу свойств такого проекта в Visual Studio, вы увидите поле для целевой платформы только для чтения, поэтому прямой поддержки для него нет (пока). В результате процесса сборки вы получите несколько вложенных папок с указанным выходным путем сборки, которые содержат сборки для всех указанных вами целевых платформ в отдельных каталогах.