Не так давно в сети появился пост Immo Landwerth, который рассказывает о .NET Standard 2.0
Если вкратце, то это унификация .NET для следующих веток .NET Framework, .NET Core и Xamarin. Выражаясь понятными словами это набор API, который будет реализован всеми платформами.
И сразу значительное изменение: .NET Standard заменит библиотеки PCL. Хотя для разработчиков суть и останется прежняя, реализация будет другой. Ездить машина будет, как и раньше, но изменится название и содержимое под капотом (пожалуй, в лучшую сторону).
В .NET Standard будут API, которые обязательно необходимо реализовать всем платформам, и будут API, реализация которых не обязательна – опциональные. Не обязательные будут доступны в виде отдельных пакетов NuGet.
Что не может быть реализовано всеми платформами можно разделить на две группы: API специфические для каждого runtime и API специфические для каждой OS. Как можно поступить с нереализуемыми API:
- Сделать API недоступным
- Сделать API доступным, но выбрасывать PlatformNotSupportedException на тех платформах, на которых нет реализации
- Имитировать API (как это делает Mono, частично имитируя реестр в виде .ini файлов)
.NET Standard использует все эти варианты и их комбинации, в зависимости от ситуации. Технологии, которые будут доступны только на определенных платформах, будут реализованы в виде пакетов NuGet. Если невозможно сделать автономный пакет, то возникают варианты: выбросить исключение или имитировать API.
Есть множество версий .NET Standard, которые совместимы с различными платформами:
Как вы можете заметить, версия фреймворка 4.6.1 встречается дважды (это не опечатка). Именно с ней будет совместим .NET Standard 2.0, а также следующие версии Xamarin и .NET Core. Произошел откат изменений, которые были сделаны в версиях 1.5 и 1.6. Почему это было сделано? Для поддержки обратной совместимости. Более новые версии .NET Standard должны содержать в себе предыдущие, плюс новые возможности. В ходе анализа NuGet.org было найдено только 6 пакетов с целевой платформой .NET Standard 1.5 и выше, автором которых является не Microsoft, поэтому решили взять за основу 4.6.1, а авторам этих 6-ти пакетов предложить их обновить.
.NET Standard хоть и заменяет PCL, но все еще поддерживает работу с ними. Из библиотеки .NET Standard вы сможете делать ссылку на другую библиотеку .NET Standard или же на библиотеку PCL
Кроме того, есть возможность сделать ссылку на обычную библиотеку .NET с помощью прокладки совместимости (compatibility shim).
Но не спешите особо радоваться. Работать будет только в случае, если в этой .NET библиотеке все API поддерживаются .NET Standard. Зато так будет гораздо проще подключить ссылки на уже существующие библиотеки.
На следующем изображении показаны основные API .NET Standard 2.0
Можно увидеть какие возможности, скорее всего, появятся у .NET Core (сейчас у этой ветки меньше всего возможностей). Что касается Xamarin, то многие из этих API уже были включены в стабильный релиз Cycle 8/Mono 4.6.0
Если хотите взглянуть на набор специфичных API, то можете взглянуть на репозиторий .NET Standard на GitHub.
Подробнее читайте в оригинальной статье: Introducing .NET Standard
Автор: asommer