![](https://habrastorage.org/files/019/f4d/490/019f4d4907b24fb4a46646d19e2b97f2.jpg)
Не так давно в сети появился пост 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
![](https://habrastorage.org/files/4a3/d64/bb1/4a3d64bb17a5491aa75844aabf639d1c.png)
Кроме того, есть возможность сделать ссылку на обычную библиотеку .NET с помощью прокладки совместимости (compatibility shim).
![](https://habrastorage.org/files/c46/06f/b6d/c4606fb6da9b4db6beeb2fb7b7d48ff1.png)
Но не спешите особо радоваться. Работать будет только в случае, если в этой .NET библиотеке все API поддерживаются .NET Standard. Зато так будет гораздо проще подключить ссылки на уже существующие библиотеки.
На следующем изображении показаны основные API .NET Standard 2.0
![](https://habrastorage.org/files/011/47d/21f/01147d21f6f04c7fb4a8c18f12aa1326.png)
Можно увидеть какие возможности, скорее всего, появятся у .NET Core (сейчас у этой ветки меньше всего возможностей). Что касается Xamarin, то многие из этих API уже были включены в стабильный релиз Cycle 8/Mono 4.6.0
Если хотите взглянуть на набор специфичных API, то можете взглянуть на репозиторий .NET Standard на GitHub.
Подробнее читайте в оригинальной статье: Introducing .NET Standard