Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Современная версия .NET поддерживает различные операционные системы и устройства. Важно, чтобы библиотеки .NET с открытым кодом обеспечивали поддержку максимального спектра разработок, будь то веб-сайт, созданный на ASP.NET и размещенный в Azure, или .NET- игра на Unity.
При выборе целевых платформ для библиотеки важно различать две разные цели:
- Современные API и шаблоны. Библиотека опирается на преимущества последних версий платформы .NET. Вы используете современные языковые шаблоны и поддерживаете расширенные модели развертывания, такие как компиляция Native Advanced-Time в CoreCLR.
- Целевой охват: Ваша библиотека поддерживает широкий спектр реализаций и версий .NET для обеспечения максимальной совместимости в различных пользовательских сценариях.
Эти цели не всегда требуют того же подхода. Если все ваши целевые приложения используют современную платформу .NET, ваши библиотеки могут ориентироваться на те же современные версии .NET без необходимости нацеливаться на старые фреймворки.
Целевые объекты .NET и .NET Standard
Целевые объекты .NET и .NET Standard — лучший способ добавить кроссплатформенную поддержку в библиотеку .NET.
- .NET версии 5–10 — это реализации .NET. Каждая версия — это один продукт с универсальным набором возможностей и API, которые можно использовать для классических приложений Windows и кроссплатформенных консольных приложений, облачных служб и веб-сайтов.
- .NET Standard — это спецификация API-интерфейсов .NET, которые доступны во всех реализациях .NET. Нацеливание на .NET Standard позволяет создавать библиотеки, которые могут использовать API-интерфейсы определенной версии .NET Standard, т. е. такие библиотеки могут использоваться на всех платформах, на которых реализуется определенная версия .NET Standard.
Дополнительные сведения о том, как .NET сравнивается с .NET Standard, см. в статье .NET 5 и .NET Standard.
Если проект предназначен для .NET или .NET Standard и успешно компилируется, это не гарантирует успешное выполнение библиотеки на всех платформах:
- API-интерфейсы для конкретных платформ не будут работать на других платформах. К примеру, Microsoft.Win32.Registry будет успешно выполняться на Windows и вызывать исключение PlatformNotSupportedException в любой другой операционной системе.
- API-интерфейсы могут работать по-разному. Например, API отражения имеют разные характеристики производительности, когда приложение использует компиляцию заранее на iOS или Android.
Совет
Команда .NET предлагает анализатор совместимости платформы, чтобы помочь вам обнаружить возможные проблемы.
✔️ ДО начните с включения целевого элемента net8.0 или более поздних версий для новых библиотек.
Для новых библиотек, предназначенных для современных .NET (например, .NET 8 или более поздней версии), предоставляет доступ к новейшим API и улучшениям производительности, а также обеспечивает такие функции, как AOT и обрезка. Современные версии .NET являются кроссплатформенными и обеспечивают отличную совместимость в Windows, Linux и macOS.
✔️ Рассмотрите возможность включения целевого объекта, если вам нужна широкая netstandard2.0 поддержка совместимости или .NET Framework.
.NET Standard 2.0 поддерживается .NET Framework 4.6.1+ и всеми современными реализациями .NET. Включите этот целевой объект, если необходимо поддерживать приложения .NET Framework или создавать библиотеки для обеспечения максимальной совместимости в разных экосистемах .NET.
❌ НЕЖЕЛАТЕЛЬНО указывать netstandard1.x целевую цель.
.NET Standard 1.x распространяется в виде детализированного набора пакетов NuGet, который создает большой пакет граф зависимостей и приводит к загрузке большого количества пакетов при сборке. Современные реализации .NET поддерживают .NET Standard 2.0. Используйте .NET Standard 1.x только в том случае, если вам необходимо поддерживать более старую платформу.
✔️ СЛЕДУЕТ указать netstandard2.0, если вам требуется целевая платформа netstandard1.x.
Все платформы, которые поддерживают .NET Standard 2.0, будут использовать целевую платформу
netstandard2.0, а граф пакетов будет меньшим. При этом старые платформы также будут работать, но использовать они будут целевую платформуnetstandard1.x.
❌ НЕ СЛЕДУЕТ указывать целевую платформу .NET Standard, если библиотека зависит от модели приложений для определенной платформы.
Например, библиотека средств управления WinUI зависит от модели приложения, доступной только в Windows. Определенные API модели приложений недоступны в .NET Standard.
❌ НЕ публикуйте netstandard2.0, если ваш проект или зависимости имеют мультинаправленное назначение.
netstandard2.0не является средой выполнения, а многоцелевые проекты предоставляют среду выполнения и специфические библиотеки, которые необходимы при запуске на других фреймворках.
Многоплатформенное целевое назначение
Иногда из библиотек необходимо получить доступ к API-интерфейсам конкретной платформы. Лучший способ вызова API для конкретной платформы — использовать многоцелевой интерфейс, который создает проект для многих целевых платформ .NET, а не только для одного.
Чтобы защитить пользователей от необходимости создавать решения для отдельных платформ, старайтесь иметь вывод на основе .NET Standard, а также один или несколько результатов для определенных платформ. При использовании нескольких целевых компонентов все сборки упаковываются в один пакет NuGet. Затем потребители могут ссылаться на тот же пакет, и NuGet выбирает соответствующую реализацию. Библиотека .NET Standard выступает в качестве резервной. Она используется всегда, за исключением случаев, когда пакет NuGet предлагает реализацию под определенную платформу. Многоплатформенное нацеливание позволяет использовать условную компиляцию кода и вызывать API-интерфейсы определенных платформ.
Например, пакет NuGet, который содержит несколько целевых объектов netstandard2.0 и net8.0 содержит отдельные сборки для каждого целевого объекта. NuGet выбирает оптимальную сборку для каждого потребителя: приложения .NET 8 используют сборку net8.0, а приложения .NET Framework и старые приложения .NET используют сборку netstandard2.0.
✔️ Учитывайте возможность нацеливания на реализации .NET в дополнение к .NET Standard.
Нацеливание на реализации .NET позволяет вызывать API-интерфейсы определенных платформ, которые не включены в .NET Standard.
Не прекращайте поддержку .NET Standard при этом. Вместо этого выдайте исключение из реализации и предложите использовать API, поддерживающие нужные возможности. Таким образом, вашу библиотеку можно использовать в любом месте и она поддерживает динамическое подключение функций во время выполнения.
public static class GpsLocation
{
// This project uses multi-targeting to expose device-specific APIs to .NET Standard.
public static async Task<(double latitude, double longitude)> GetCoordinatesAsync()
{
#if NET462
return CallDotNetFrameworkApi();
#elif NET8_0_WINDOWS
return CallWindowsApi();
#else
throw new PlatformNotSupportedException();
#endif
}
// Allows callers to check without having to catch PlatformNotSupportedException
// or replicating the OS check.
public static bool IsSupported
{
get
{
#if NET462 || NET8_0_WINDOWS
return true;
#else
return false;
#endif
}
}
}
✔️ РАССМОТРИТе возможность мультинацеливания, даже если исходный код одинаков для всех целей, если у вашего проекта есть зависимости от библиотек или пакетов.
Зависимые пакеты проекта, будь то непосредственные или транзитивные, могут использовать одни и те же API кода, включенные в разные версии зависимой сборки в зависимости от целевой платформы. Добавление конкретных целевых объектов гарантирует, что пользователям не нужно добавлять или обновлять перенаправления привязки сборки.
❌ ИЗБЕГАЙТЕ многоплатформенной разработки и разработки для .NET Standard, если ваш исходный код одинаков для всех целевых платформ и ваш проект не имеет зависимостей от библиотек или пакетов.
NuGet будет автоматически использовать сборку .NET Standard. Нацеливание на отдельные реализации .NET увеличивает размер файла
*.nupkg, не давая взамен никаких преимуществ.
✔️ Рекомендуется добавить назначение для net462, когда вы также используете netstandard2.0.
Некоторые проблемы с использованием .NET Standard 2.0 в .NET Framework были устраненные в .NET Framework версии 4.7.2. Вы можете улучшить интерфейс для разработчиков, которые по-прежнему находятся на платформа .NET Framework 4.6.2 - 4.7.1, предлагая им двоичный файл, созданный для платформа .NET Framework 4.6.2.
✔️ ДО распространяйте вашу библиотеку с помощью пакета NuGet.
NuGet выберет наиболее подходящий целевой объект для разработчиков и избавит их от необходимости выбора подходящей реализации.
✔️ СЛЕДУЕТ использовать свойство TargetFrameworks файла проекта при мультиплатформенном нацеливании.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<!-- This project will output net8.0 and netstandard2.0 assemblies -->
<TargetFrameworks>net8.0;netstandard2.0</TargetFrameworks>
</PropertyGroup>
</Project>
❌ Избегайте изменения имени сборки или использования различных имен сборок для каждой библиотеки TFM. Из-за зависимостей между библиотеками многоплатформенность с различными именами сборок для каждого TFM может нарушить работу потребителей пакетов. Сборка должна иметь одинаковое имя для всех TFM.
Старые цели
.NET поддерживает целевые версии платформа .NET Framework, которые не поддерживаются, а также платформы, которые больше не используются. Хотя стремление сделать библиотеку совместимой с как можно большим количеством платформ имеет ценность, необходимость обходить отсутствие API может добавить значительные накладные расходы. Учитывая их охват и ограничения, на некоторые фреймворки больше не стоит ориентироваться.
❌ НЕ добавлять целевую платформу переносимой библиотеки классов (PCL). Например, portable-net45+win8+wpa81+wp8.
.NET Standard предлагает современный способ поддержки кроссплатформенных библиотек .NET и полностью заменяет PCL.
❌ НЕ СЛЕДУЕТ добавлять цели для платформ .NET, которые более не поддерживаются. Например, SL4, WP.