Всякий раз, когда в текущем процессе появляются отклонения, надо задать следующие вопросы: «Это случилось потому, что у нас не было стандарта? Это случилось потому, что мы не следовали стандарту? Это случилось потому, что стандарт не был адекватным?»
Масааки Имаи (автор концепции Кайдзен)
Кроссплатформенность — одно из основных требований для приложения на рынке. Большая часть современных языков программирования кроссплатформенны, однако, почти на всех языках разработчик сталкивается с проблемой совместимости его ПО с той или иной системой. Приходится компилировать свой проект под конкретную операционную систему или вести разработку проекта под среду исполнения интерпретируемого языка.
Среда исполнения .NET позволяет разрабатывать кроссплатформенное ПО используя промежуточный код (байт код). .NET выглядит лучшим, на мой взгляд, решением для разработки кроссплатформенного ПО. Однако, как и у всех других, у этого решения есть свои недостатки. Их призван устранить .NET Standard.
Как это было
Рассмотри несколько платформ .NET. Во-первых, .NET Framework — доступна только под Windows, нельзя запустить среду исполнения на других операционных системах. Во-вторых, Mono/Xamarin — это действительно кроссплатформенное решение, поддерживающее Mac, IOS, Android. Из недостатков — отсутствие полной совместимости с .NET Framework, вследствие чего приходится вырезать куски кода из проекта при портировании в Mono/Xamarin. Ещё одна платформа, которая появилась совсем недавно — .NET Core. Она позволяет разрабатывать и запускать серверное кроссплатформенное ПО под Windows, Linux, Mac, Docker.
Даже при большом разнообразии и покрытии операционных систем, разрабатываемая программа может быть не кроссплатформенной, т.к. сами платформы совместимы не полностью. Решение есть — разрабатываем ядро полностью совместимое со всеми платформами и дописываем недостающие части. А как определить, что совместимо, а что нет? Остаётся только тратить время на изучение документаций и API этих платформ.
Portable Class Library — предок .Net Standard Library
Portable Class Library (PCL) — инструмент для разработки кроссплатформенной библиотеки. При создании проекта необходимо выбрать список платформ и приступить к разработке. Изначально PCL поддерживала только Windows и Windows Phone. Вскорости Microsoft приобрел Xamarin, что сразу привнесло поддержку Xamarin в PCL. По мере разработки .NET Core, также появилась поддержка этой платформы в PCL. Платформ становится всё больше — следовательно PCL, как пересечение платформ, становится всё меньше. Microsoft решила предложить альтернативное решение.
Новая платформа .NET Standard Library
Microsoft добавляет новую платформу .NET Standard Library. Первая мысль: «теперь нужно ещё больше читать документации, чтобы проект работал и на этой платформе тоже». Как оказалось, это не так. .NET Standard Library — формальный набор спецификаций общих интерфейсов других платформ: .NET Core, .NET Framework, Mono/Xamarin и остальных. Библиотеки, удовлетворяющие спецификациям .NET Standard, могут быть использованы на различных платформах .NET. Фактически, Standard гарантирует возможность использования библиотек в разных средах исполнения, он приносит универсальность, которой так не хватало, в экосистему .NET.
.NET Standard изменяет архитектуру приложений, он располагается как слой между общей инфраструктурой .NET и конечными платформами.
Выделить кроссплатформенное ядро приложения стало гораздо проще. Достаточно, чтобы ядро собиралось под Standard. Также, в этом ядре можно использовать любые другие библиотеки .NET Standard. Новая прослойка является куратором для будущих платформ. Новые платформы должны будут соответствовать .NET Standard, а не наоборот, как это было с PCL.
Свой Standard под каждую платформу
.NET Standard Library различаются по версиям — каждая версия имеет полную совместимость с следующей (что нельзя сказать о PCL). Обратной совместимости нет. При выборе более высокой версии будет доступно большее количество API для разработки библиотеки. Однако, это означает, что меньше платформ будут поддерживать разрабатываемую библиотеку. Ниже приведена таблица разных версий .NET Standard (таблица составлена для Release версии .NET Standard).
Target Platform Name | Alias | |||||||
---|---|---|---|---|---|---|---|---|
.NET Standard | netstandard | 1.0 | 1.1 | 1.2 | 1.3 | 1.4 | 1.5 | 1.6 |
.NET Core | netcoreapp | → | → | → | → | → | → | 1.0 |
.NET Framework | net | → | 4.5 | 4.5.2 4.5.1 |
4.6 | 4.6.1 | 4.6.2 | 4.6.3 |
Universal Windows Platform | uap | → | → | → | → | 10.0 | ||
Windows | win | → | 8.0 | 8.1 | ||||
Windows Phone | wpa | → | → | 8.1 | ||||
Windows Phone Silverlight | wp | 8.1 8.0 |
||||||
Mono/Xamarin Platforms | → | → | → | → | → | → | * | |
Mono | → | → | * |
В первой строке приведены номера версий .NET Standard Library. В каждой следующей строке указана платформа и версия, которая может использовать библиотеку, написанную с использованием соответствующего Standard. Стрелки указывают на совместимость данной версии Standard с следующей ячейкой в той же строке.
Примеры:
- Если библиотека удовлетворяет спецификациям .NET Standard 1.3, то она может быть использована только на платформах: .NET Framework 4.6 (и более новыми), .NET Core, Universal Windows Platform 10 (UWP) и Mono/Xamarin.
- Если библиотека пишется под Standard 1.3, то в ней можно использовать другие библиотеки, которые написаны с использованием версий Standard: 1.0, 1.1, 1.2, 1.3.
Понимание .NET Standard Library
.NET Standard Library можно представить в виде абстрактных множеств, каждое следующие будет содержать предыдущее и добавлять, что-то своё, покрывая больше кода платформ .NET. Соответственно, их размер будет увеличиваться по мере увеличения номера версии.
C каждой новой версией функционал ядра приложения будет расти, однако, многие возможности «полноценных» платформ будут не доступны. Посмотрим на изображения других множеств: .NET Framework, .NET Core, Mono/Xamarin:
.NET Standard одной и той же версии покрывает идентичное множество кода этих платформ. И находиться целиком внутри их пересечения. Ядро приложения будет находиться внутри центрального круга. Само приложение лучше разделить на три части для реализации поддержки других платформ. Таким образом, готовый продукт будет работать сразу на трёх платформах и на нескольких операционных системах.
Плюсы использования .NET Standard Library:
- Кроссплатформенность, несколько платформ .NET, несколько операционных систем.
- Поддержка кода — проект будет проще поддерживать после релиза, добавляя в него новый функционал без портирования.
- Гарантия работы — очередная библиотека из Nuget под .NET Standard точно будет работать на нескольких операционных системах.
Минусы использования .NET Standard Library:
- Ограничения по функционалу из коробки — .NET Standard продолжает развиваться.
- Сложности с переносом под .NET Standard уже существующих проектов.
Заключение
.NET Standard Library является хорошей заменой неудобной библиотеки Portable Class Library. Standard Library гораздо лучше в плане кроссплатформенности. Теперь можно без больших проблем выделить кроссплатформенное ядро приложения или разработать кроссплатформенную библиотеку, удовлетворяющие спецификациям .NET Standard. Затем написать нужные интерфейсы под необходимые операционные системы и получить готовый продукт.
Автор: Detrav