Поддержка выбора нескольких версий платформ .NET в файле проекта
При создании проекта рекомендуется также создать библиотеку классов .NET Standard, так как она обеспечивает совместимость с самыми разными потребляющими проектами. С помощью .NET Standard можно добавить в библиотеку .NET. поддержку разных платформ по умолчанию. Но в некоторых сценариях также может потребоваться включить код, предназначенный для конкретной платформы. В этой статье показано, как это сделать для проектов на основе пакетов SDK.
Для таких проектов можно настроить поддержку нескольких целевых платформ (TFM) в файле проекта, а затем использовать dotnet pack
или msbuild /t:pack
для создания пакета.
Примечание.
CLI nuget.exe не поддерживает упаковку проектов на основе пакетов SDK, поэтому используйте только dotnet pack
или msbuild /t:pack
. Рекомендуется включить все свойства, которые обычно находятся в файле .nuspec
файла проекта. Чтобы выбрать несколько версий .NET Framework в проекте не на основе пакетов SDK, см. руководство по обеспечению поддержки нескольких версий .NET Framework.
Создание проекта с поддержкой нескольких версий .NET Framework
Создайте библиотеку классов .NET Standard в Visual Studio или используйте
dotnet new classlib
.Рекомендуется создать библиотеку классов .NET Standard для обеспечения лучшей совместимости.
Измените файл .csproj, чтобы обеспечить поддержку целевых платформ. Например, измените
<TargetFramework>netstandard2.0</TargetFramework>
на:
<TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
Убедитесь, что для XML-элемента единственное число изменено на множественное (добавьте s в теги открытия и закрытия).
Если у вас есть код, который работает только на одной целевой платформе (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 } }
Добавьте необходимые метаданные NuGet в файл .csproj как свойства MSBuild.
Список доступных метаданных пакета и имен свойств MSBuild см. в разделе об упаковке целевого объекта. Также см. раздел Управление ресурсами зависимости.
Если необходимо отделить свойства, связанные со сборкой, от метаданных NuGet, можно использовать другое свойство
PropertyGroup
или поместить свойства NuGet в другой файл и использовать директивуImport
MSBuild для включения. Начиная с MSBuild 15.0, также поддерживаются значенияDirectory.Build.Props
иDirectory.Build.Targets
.Теперь используйте
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>