Подтвердить что ты не робот

.NET Standard,.NET Core, PCL

.NET Standard - запутанная концепция. Идея стандартного формата библиотеки .NET звучит великолепно. Но не совсем понятно, что именно. В Visual Studio теперь есть шаблоны проектов .NET Core и .NET Standard Class Library, а также старые проекты PCL. Я также обнаружил, что если вы перейдете к настройкам проекта, вы можете переключить существующую библиотеку PCL на .NET Standard. Не ясно, является ли стандарт .NET библиотекой? Или в формате DLL.

Основной вопрос, который я задаю, - на какую библиотеку мы должны ориентироваться? Я делаю это в основном для проектов Xamarin, но было бы здорово, если бы мы могли делиться этими библиотеками с другими платформами, особенно .NET Core и UWP. Это сбивает с толку то, почему Microsoft выпустила два, казалось бы, идентичных типа библиотек классов одновременно:.NET Core и .NET Standard.

Определения

NET Core - среда выполнения на основе .NET, соответствующая определению API.NET Standard.

PCL - формат библиотеки на основе .NET, поддерживаемый несколькими средами выполнения, включая .NET, Mono, UWP и т.д.

Стандарт .NET (определение 1) - набор стандартных определений API для сред выполнения на основе .NET

Стандарт .NET (определение 2) - формат библиотеки на основе .NET, поддерживаемый несколькими средами выполнения, включая .NET, Mono, UWP и т.д., Который является продолжением формата PCL. В Visual Studio библиотеку PCL можно преобразовать в библиотеку .NET Standard, перейдя в свойства проекта и отредактировав целевую среду.

4b9b3361

Ответ 1

Это от Сэмюэля Энгларда (https://github.com/dotnet/corefx/issues/973#issuecomment-249582799):

.NET DLL отформатированы в соответствии с ECMA-335 (лучше известный как Общая языковая инфраструктура). Этот формат актуален для всех платформы, которые мы называем .NET; Full Framework, Core, Xamarin, Mono, Silverlight и т.д.

Причина, по которой вы не можете использовать DLL, скомпилированную для одной платформы с другое было то, что формат не определял API (вообще говоря). Так что, хотя они все могли читать DLL, вы столкнулись с проблемами класса XYZ находится в пространстве имен A.B.C на одной платформе и в пространстве имен D.E.F на другое, если оно вообще было.

PCL "решили" это, выполнив две вещи:

Они использовали переадресацию типов, так что даже если вы написали код, ожидающий класса XYZ в пространстве имен A.B.C, его можно было найти на платформах, где он был в другом месте. Он ограничивал API-интерфейсы, которые вы можете использовать, на наименьшем общем наборе, доступном для всех платформ, которые вы хотели.

Взятие PCL и преобразование его в проект .NET Standard не является перекомпилировать из-за формата вывода, но из-за метаданных включен (в частности, тип переадресации).

Итак, я думаю, что по сути библиотеки .NET Standard ничем не отличаются от библиотек PCL, за исключением того факта, что они помещают слой поверх другого стандартизированного набора API, и эти API могут реализовывать разные указатели (переадресация типов).

.NET Core - это, конечно, среда выполнения, но я думаю, что она очень тесно связана с .NET Standard. Я не думаю, что это имеет какое-то особое отношение к нему, кроме факта, что он реализует стандартные API.NET.

На мой взгляд, в целом лучше ориентироваться на библиотеку стандартных классов .NET, поскольку она будет совместима на нескольких платформах. Если вы нацелены на .NET Core, на этот тип сборки нельзя ссылаться, например, в UWP. Вы увидите это:

enter image description here

Однако, если вы работаете в чистой среде .NET Core, вы можете обнаружить, что доступны API-интерфейсы, специфичные для среды выполнения .NET Core, и, следовательно, необходимо будет напрямую ориентироваться на .NET Core.

Пожалуйста, посмотрите этот глоссарий:https://github.com/dotnet/corefx/blob/master/Documentation/project-docs/glossary.md

Ответ 2

Документы вокруг этого действительно запутывают, но его можно грубо понять следующим образом:

  • PCL: библиотеки, предназначенные для набора платформы (имеют "наименее общий знаменатель" API этих платформ). Поэтому при написании PCL вы говорите, что я хочу настроить таргетинг на платформу A, B, C

  • Стандарт .NET: стандартный набор API, а не платформа. Поэтому в основном вам не нужны платформы, просто стандарт (версия 1.3, 1.6...), и ваш код будет работать на всех платформах, которые его поддерживают.

  • Ядро .NET не следует путать здесь, это еще одна версия .NET framework. Стандарт .NET будет работать в режиме межпроцессного времени (.NET framework,.NET core, Mono).

Итак, я думаю, что стандарт .NET - это путь:)

Ответ 3

Я считаю, что этот ресурс отвечает на большинство ваших вопросов:

https://docs.microsoft.com/en-us/dotnet/articles/standard/library

Стандартная библиотека .NET - это формальная спецификация .NET API, которые должны быть доступны во всех сеансах .NET. Мотивация, лежащая в основе стандартной библиотеки, заключается в обеспечении большей однородности в экосистеме .NET.

Итак, как я понимаю, другие типы библиотек являются специфичными для платформы, а стандарт .NET является агностическим для платформы.

Если вы хотите, чтобы ваш код был доступен на разных платформах, тогда стандарт .NET кажется идеальным, но обратите пристальное внимание на ту версию стандарта .NET, которую поддерживают другие платформы (см. таблицу в ссылке).

Надеюсь, что это поможет

Ответ 4

Стандарт предназначен для ориентации на определенный набор API, аналогичный версиям API Android. Библиотека nuget - это всего лишь мета-пакет, содержащий все библиотеки, которые соответствуют стандарту.

Скотт Хантер на выставке MSDEV очень хорошо объяснил эту концепцию. Стоит проверить его - http://msdevshow.com/2016/07/dot-net-core-with-scott-hunter/