Поделиться через


Ориентирование на несколько версий .NET при сборке

Назначение нескольких платформ .NET в сборке позволяет гарантировать доступность приложения или библиотеки для разных версий или выпусков .NET.

Мультитаргетинг для проектов .NET Core и .NET 5 и более поздних значительно отличается от мультитаргетинга для проектов .NET Framework. См. сравнение между .NET Framework и многонацелевой.NET Core.

Настройка мультитаргетинга .NET

  1. Создайте новую библиотеку классов .NET Standard в Visual Studio или с помощью команды dotnet new classlib.

  2. Измените файл проекта. Измените файл .csproj для поддержки нескольких целевых платформ. Измените элемент <TargetFramework> на <TargetFrameworks> и перечислите фреймворки, которые вы хотите поддерживать.

    <Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFrameworks>netstandard2.0;net45;netcoreapp3.1;net5.0</TargetFrameworks>
    </PropertyGroup>
    </Project>
    
  3. Используйте символы условной компиляции для разделения кода, относящегося к определённой версии.

    public string GetFramework()
    {
    #if NET45
        return ".NET Framework 4.5";
    #elif NETSTANDARD2_0
        return ".NET Standard 2.0";
    #elif NETCOREAPP3_1
        return ".NET Core 3.1";
    #elif NET5_0
        return ".NET 5.0";
    #else
        return "Unknown Framework";
    #endif
    }
    
  4. Сборка и упаковка. Чтобы создать пакет, используйте команду dotnet pack или MSBuild.exe /t:pack. Это создаст файл .nupkg, предназначенный для всех указанных платформ.

    MSBuild.exe /t:pack MyProject.csproj
    

Управление зависимостями

При выборе нескольких версий платформы может потребоваться обрабатывать зависимости по-разному для каждой версии. Используйте условные ItemGroup элементы в файле проекта, чтобы указать зависимости, зависящие от платформы.

<ItemGroup Condition="'$(TargetFramework)' == 'net45'">
<PackageReference Include="SomePackage" Version="1.0.0" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
<PackageReference Include="SomeOtherPackage" Version="2.0.0" />
</ItemGroup>

Обработка зависимостей для конкретной версии в проекте .NET включает использование условных PackageReference элементов в файле проекта. Это позволяет указать разные версии пакета для разных целевых платформ. Вот как это сделать:

Добавление зависимостей для конкретной версии

  1. Изменить файл проекта: откройте файл .csproj и добавьте элементы условного PackageReference внутри элемента ItemGroup. Таким образом, можно указать различные версии пакета на основе целевой платформы.

     <Project Sdk="Microsoft.NET.Sdk">
     <PropertyGroup>
         <TargetFrameworks>net45;netstandard2.0;netcoreapp3.1;net5.0</TargetFrameworks>
     </PropertyGroup>
     <ItemGroup Condition="'$(TargetFramework)' == 'net45'">
         <PackageReference Include="SomePackage" Version="1.0.0" />
     </ItemGroup>
     <ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
         <PackageReference Include="SomePackage" Version="2.0.0" />
     </ItemGroup>
     <ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.1'">
         <PackageReference Include="SomePackage" Version="3.0.0" />
     </ItemGroup>
     <ItemGroup Condition="'$(TargetFramework)' == 'net5.0'">
         <PackageReference Include="SomePackage" Version="4.0.0" />
     </ItemGroup>
     </Project>
    
  2. использовать интерфейс командной строки. Вы также можете добавить зависимости с помощью .NET CLI. Например, чтобы добавить зависимость для конкретной целевой платформы, можно использовать следующую команду:

     dotnet add package SomePackage --version 1.0.0 --framework net45
    

Управление транзитивными зависимостями

Транзитивные зависимости — это зависимости ваших зависимостей. Важно проверить и управлять ими, чтобы избежать конфликтов и обеспечить совместимость. Команду dotnet list package можно использовать для просмотра всех зависимостей и их версий.

dotnet list package

Обработка алмазных зависимостей

Зависимости алмазов возникают, когда в дереве зависимостей присутствует несколько версий пакета. NuGet разрешает их, выбрав самую низкую применимую версию. Чтобы избежать проблем, можно указать диапазоны версий или использовать перенаправления привязок в проектах .NET Framework.

<PackageReference Include="ExamplePackage" Version="[1.0,2.0)" />

Следуя этим рекомендациям, вы можете эффективно управлять зависимостями, зависящими от версии, в проектах .NET, обеспечивая совместимость и стабильность в разных целевых платформах. См. Управление зависимостями пакетов в приложениях .NET, Зависимости , и как NuGet разрешает зависимости пакетов .

Сравнение между .NET Framework и .NET Core Multitargeting

Мультитаргетирование для .NET Core (и .NET 5 и более поздних версий) очень отличается от многонацелий для проектов .NET Framework.

Платформа .NET Framework

  • Ограниченная многоцелевость: .NET Framework поддерживает многоцелевую поддержку, но она имеет больше ограничений по сравнению с .NET Core. Он может использовать разные версии .NET Framework, но не несколько платформ одновременно. См. мультитаргетинг MSBuild .
  • Старый набор инструментов: использует более старый тип мультицелевой обработки с MSBuild, где проект может использовать только одну платформу и один фреймворк одновременно.

.NET Core

  • Advanced Multitargeting: .NET Core поддерживает расширенное многоплатформенное нацеливание, что позволяет одновременно нацеливаться на несколько фреймворков, используя свойство <TargetFrameworks> в файле проекта. См. целевые платформы.
  • современный набор инструментов: использует более новый тип многонацеливания с MSBuild, выполняя несколько сборок для каждой перечисленной целевой платформы.

Заметка

Эта статья была частично создана с помощью искусственного интеллекта. Перед публикацией автор проверил и пересмотрел содержимое по мере необходимости. См. Принципы использования содержимого, созданного СИ, в Microsoft Learn.