Стандарт .NET против .NET Core

240

Я читал о разнице между .NET Standard и .NET Core, но я действительно не знаю, в чем разница, или когда выбирать проект библиотеки .NET Standard, и когда выбирать проект библиотеки .NET Core.

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

С .NET Core я прочитал, что он также предназначен для кроссплатформенного использования, поэтому, если я выберу библиотеку .NET Core, мне кажется, что я могу использовать ее и на многих платформах, точно так же как .NET Standard.

Так что в конце я не вижу разницы. Когда я должен использовать что? В чем разница между ними?

Альваро Гарсия
источник
33
В терминах кода: .net стандарт = интерфейс, .net ядро ​​= класс; если вы кодируете класс, вы можете получить больше методов (и т. д.), но вы ограничены этим конкретным типом (и потомками); если вы используете интерфейс, вы можете получить меньшую поверхность, но он будет работать против произвольных реализаций ... до тех пор, пока эти реализации делают то, что ожидается :) да, ядро ​​.net предназначается для нескольких платформ, но есть и другие реализации .net стандарт
Марк Гравелл
9
.NETStandard - это замена PCL. Portable Class Library помогла вам написать библиотеку, которая могла бы работать на нескольких платформах (телефон, рабочий стол, магазин, браузер, xbox и т. Д.). Это не очень хорошо масштабируется, плохо страдая от русских! проблема, поэтому они отказались от нее. .NETCore - это только первый фреймворк, который они сделали, он был самым простым, остальное должно наверстать упущенное. Имейте в виду, что это очень незавершенный процесс, большие изменения ожидаются с .NETStandard v2.0. Стандарт для управления ими всем, а пока :)
Ганс
Пожалуйста, не добавляйте дополнительные вопросы к существующему. Ваш вопрос в редактировании является отдельным к этому.
Джон Скит
1
@JonSkeet Тогда я должен открыть новый вопрос? Спасибо за совет. потому что сначала я открыл новый вопрос о многоцелевой цели .net Core, и мне отказали в голосовании, потому что они сказали, что это дублирующий вопрос.
Альваро Гарсия
@ ÁlvaroGarcía: Да, но проясните - ваш текущий вопрос из одного предложения мне вообще не понятен.
Джон Скит

Ответы:

195

Я постараюсь уточнить ваши сомнения и расширить ответ Джона Скита.

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

Как сказано в моем другом комментарии, Дэвид Фаулер (David Fowler) предлагает хорошую аналогию для отношений между .NET Standard и другими реализациями .NET Standard (.NET Core, .NET Framework и т. Д.) : Есть версии .NET Standard Interfaces, а фреймворки - реализации этих интерфейсов.

Эта упрощенная схема может помочь понять эту связь:

NET Стандартные интерфейсы аналогия

Все, что предназначено, NetCore10имеет доступ к INetStandard15API и NetCore10 определенным API (таким как DotNetHostPolicy).

Конечно, эта библиотека не может использоваться в разных INetStandard15реализациях ( NetCore10не конвертируется в NetFramework462или Mono46).

Если вместо этого вам нужен доступ только к INetStandard15API (и нацеленность на эту спецификацию вместо конкретной платформы), ваша библиотека может использоваться любой платформой, которая ее реализует ( NetCore10, NetFramework462и т. Д.)

Примечание: в оригинальной аналогии Дэвид Фаулер использовал интерфейсы как для версий .NET Standard, так и для реализаций фреймворков. Я считаю, что использование интерфейсов и классов, напротив, более интуитивно понятно и лучше отражает связь между спецификациями и конкретными реализациями.

Федерико Дипума
источник
2
Большое спасибо за это. Но у меня есть сомнения. Если стандарт .net является интерфейсом и может быть реализован, например, с помощью .net framework и .net Core, когда я создаю стандартную библиотеку классов .net и использую эту библиотеку в другом проекте, какая реализация используется, net framework или .net ядро?
Альваро Гарсия,
8
Он будет использовать реализацию скомпилированного приложения (что бы это ни было). Если вы скомпилируете основное ядро ​​NET, то оно будет использовать базовые библиотеки NET (которые являются реализацией стандарта NET)
Федерико Дипума
5
Эта диаграмма - фантастическая помощь в иллюстрации отношений ядро ​​/ стандарт / каркас.
яшма
Поэтому, если я создаю консольное приложение net461 и нацеливаюсь на библиотеку netstandard2.0, ничего из этой стандартной библиотеки не разрешается в консольном приложении. Так... ??
Синастетик
2
Картинка стоит тысячи слов
Никаас
182

.NET Core - это реализация стандарта .NET. Он доступен в нескольких операционных системах, но это не одно и то же - есть и другие реализации .NET Standard.

Поэтому, если вы создадите библиотеку .NET Core, у нее будет доступ к вещам, которые реализованы в .NET Core, но не являются частью .NET Standard, и ваша библиотека не будет совместима с другими реализациями .NET Standard, такие как Xamarin, Tizen, полноценная платформа .NET для рабочего стола и т. д.

Вкратце: чтобы добиться максимальной переносимости, сделайте вашу библиотеку целевой .NET Standard.

Джон Скит
источник
5
@ ÁlvaroGarcía: Что значит «это» должно быть совместимо? .NET Core 1.0? Не обязательно - потому что .NET Core 1.0 все еще может включать в себя дополнительные вещи. Эта запись означает, что если вы ориентируетесь на .NET Standard 1.6, вы можете запускать код под Mono 4.6 и .NET Core 1.0.
Джон Скит
4
Вы не можете запустить сборку .NET Core ни на чем, кроме .NET Core (CoreCLR & CoreFX). Сборку .NET Standard можно запустить на любой платформе, которая отвечает договорным обязательствам для соответствующего стандарта (1.3, 1.6, 2.0 и т. Д.).
Марк Рендл
2
Кроссплатформенность относится к операционной системе, а не к фреймворку.
Марк Рендл
15
В качестве аналогии попробуйте представить .NET Standard как интерфейс (например INetStandard16). .NET Core 1.0 и Mono 4.6 оба реализуют INetStandard16. Вы не можете конвертировать .Net Core 1.0 в Mono 4.6 (и наоборот), но все, что использует, INetStandard16будет работать на обоих. (благодарность Дэвиду Фаулеру )
Федерико Дипума
6
Это удивило меня. Имена кажутся задом наперед. Вы могли бы подумать, что что-то под названием «ядро» было бы более минимальным из двух ...
jpmc26
6

Библиотека .NET Core Class - это, по сути, подмножество библиотеки .NET Framework, которая содержит меньше API. Придерживаясь библиотеки .NET Core Class, сложно делиться кодом между средами выполнения. Этот код может не работать для другой среды выполнения (Mono для Xamarin), потому что у него нет API, который вам нужен. Для решения этой проблемы существует .NET Standard, который представляет собой набор спецификаций, которые сообщают вам, какие API вы можете использовать . Основная цель .NET Standard - делиться кодом между средами выполнения. И важно, чтобы эта спецификация была реализована во всех средах выполнения. (.NET Framework, .NET Core и Mono для Xamarin).

Поэтому, если вы уверены, что будете использовать свою библиотеку только для проектов .NET Core, вы можете проигнорировать .NET Standard, но если есть даже небольшой шанс, что ваш код будет использоваться .NET Framework или Mono для Xamarin, то лучше придерживаться .NET Standard

Также обратите внимание, что более высокие версии .NET Standard содержат больше API, но более низкие версии поддерживаются большим количеством платформ. Поэтому, если вы создаете стандартную библиотеку .NET, которую вы хотите использовать совместно между средами выполнения, тогда выберите самую низкую версию , какую только сможете , что поможет вам достичь большинства платформ. Например, если вы хотите работать в .NET Framework 4.5 и .NET Core 1.0, самая высокая версия .NET Standard, которую вы можете использовать, - это .NET Standard 1.1. Обратитесь к этой большой таблице из документации для получения дополнительной информации об этом.

PS: Также, если вы хотите преобразовать свою библиотеку в .NET Standard, вам поможет .NET Portability Analyzer.

user2771704
источник
5

.NET Standard - это спецификация .NET API, предназначенная для использования в реализациях .NET. Это позволяет определить единый набор API BCL для всех реализаций .NET.

.NET Core - одна из таких реализаций .NET Standard. .NET Framework - это еще одна реализация стандарта .NET.

Изображение из .NET Blog

введите описание изображения здесь

Ответ Federicos дает вам графическое представление о том, как каждая структура развивается с версиями. Посмотрите на диаграмму ниже из Документов Microsoft .

введите описание изображения здесь

Ориентация на .NET Standard повышает поддержку вашей платформы, тогда как ориентация на конкретную платформу .NET, такую ​​как .NET Core (или .NET Framework), позволит вам использовать все функции платформы для этой платформы.

Nipuna
источник
2

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

.NET Core - это реализация стандарта .NET, оптимизированная для создания консольных приложений, веб-приложений и облачных сервисов с использованием ASP.NET Core. Его SDK поставляется с мощным инструментарием, который в дополнение к разработке Visual Studio поддерживает полный рабочий процесс разработки на основе командной строки. Вы можете узнать о них больше на aka.ms/netstandardfaq и aka.ms/netcore .


Выше, вместе с очень ясным объяснением большинства вещей, обсуждаемых в этом вопросе, можно найти в следующей чрезвычайно полезной статье Microsoft (MSDN - сентябрь 2017 г.): .NET Standard - Демистификация .NET Core и .NET Standard

steliosalex
источник
0

Вы имели в виду .NET Framework? Потому что .NET стандарт представляет собой реализации, такие как .NET Framework, .NET Core и Xamarin.

Я люблю .NET Core, потому что мы можем разместить его в Linux (используйте nginx в моем опыте). Это отличается от .NET Framework, который вы можете разместить только на IIS. Вы можете рассмотреть вопрос о бюджете хостинга в этом случае (потому что Windows Server дорог для меня).

С точки зрения среды разработки , ядро ​​.Net легкое. Таким образом, вы можете использовать VSCode, Sublime, для IDE (не только Visual Studio).

Фитьян Аула
источник
0

Проще говоря, стандарт .NET используется для написания проектов библиотек классов, которые компилируются в dll. .NET Core можно использовать для разработки реальных веб-приложений, которые могут работать во всех операционных системах (Windows, Linux, MacOS). (В .NET Core 3 Microsoft предоставила функциональность для разработки настольных приложений с использованием WPF, но до сих пор эти приложения не будут кроссплатформенными и будут работать только в системе Windows. В будущем Microsoft может сделать их также кроссплатформенными). Стандарт стандарта .NET Библиотеки / библиотеки могут быть использованы в любом приложении, которое использует .NET (.NET Framework, .NET Core), что означает, что вы можете использовать стандарт .NET как с .NET Framework, так и с .NET core.

Валид Навид
источник