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


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

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

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

Замечание

nuget.exe CLI не поддерживает проекты в стиле SDK, поэтому следует использовать только dotnet pack или msbuild /t:pack. Рекомендуется включить все свойства, которые обычно находятся в .nuspec файле, в файл проекта вместо этого. Чтобы нацелиться на несколько версий .NET Framework в проекте нестандартного пакета SDK, подробнее см. в разделе «Поддержка нескольких версий .NET Framework».

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

  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>

См. также