Поддержка нескольких платформ .NET в файле проекта

При первом создании проекта рекомендуется создать библиотеку классов .NET Standard, так как она обеспечивает совместимость с самым широким спектром потребляемых проектов. С помощью .NET Standard вы добавляете кроссплатформенную поддержку в библиотеку .NET по умолчанию. Однако в некоторых сценариях может потребоваться также включить код, предназначенный для конкретной платформы. В этой статье показано, как это сделать для проектов в стиле SDK .

Для проектов в стиле SDK можно настроить поддержку нескольких целевых платформ (TFM) в файле проекта, а затем использовать dotnet pack или msbuild /t:pack создать пакет.

Создание проекта, поддерживающего несколько платформ .NET

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

    Рекомендуется создать библиотеку классов .NET Standard для обеспечения оптимальной совместимости.

  2. Измените CSPROJ-файл для поддержки целевых платформ. Например, изменение

    <TargetFramework>netstandard2.0</TargetFramework>

    to:

    <TargetFrameworks>netstandard2.0;net45</TargetFrameworks>

    Убедитесь, что вы изменяете элемент XML с единственного числа на множественное (добавьте "s" как к открывающим, так и к закрывающим тегам).

  3. Если у вас есть код, который работает только в одном TFM, можно использовать #if NET45 или #if NETSTANDARD2_0, чтобы разделять код, зависящий от TFM. (Дополнительные сведения см. Как использовать многозадачность.) Например, можно использовать следующий код:

    public string Platform {
       get {
    #if NET45
          return ".NET Framework"
    #elif NETSTANDARD2_0
          return ".NET Standard"
    #else
    #error This code block does not match csproj TargetFrameworks list
    #endif
       }
    }
    
  4. Добавьте любые метаданные NuGet в csproj в качестве свойств MSBuild.

    Список доступных метаданных пакета и имен свойств MSBuild см. цель сборки пакета. См. также раздел "Управление ресурсами зависимостей".

    Если вы хотите разделить свойства, связанные с процессом сборки, от метаданных NuGet, то можете использовать другое PropertyGroup или поместить свойства NuGet в другой файл и использовать директиву MSBuild Import для его включения. Directory.Build.Props и Directory.Build.Targets также поддерживаются начиная с MSBuild 15.0.

  5. Теперь используйте dotnet pack, и результирующий .nupkg нацелен на .NET Standard 2.0 и .NET Framework 4.5.

Ниже приведен ФАЙЛ CSPROJ , созданный с помощью предыдущих шагов и пакета SDK для .NET Core 2.2.

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
    <Description>Sample project that targets multiple TFMs</Description>
  </PropertyGroup>

</Project>

Многоцелевой выбор с повторяющимися платформами

Начиная с NuGet 7.6 / .NET SDK 10.0.300, можно использовать несколько TargetFrameworks значений, разрешающихся в одной базовой платформе. Это позволяет реализовать сценарии, такие как сборка для необходимых сред выполнения или ориентация на несколько версий основного приложения из одного проекта.

Дополнительные сведения о том, как это работает с восстановлением и пакетом, см. в статье "Назначение нескольких платформ".

См. также