.NET Standard против .NET Core

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

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

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

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


person Álvaro García    schedule 20.05.2017    source источник
comment
В терминах кода: .net standard = интерфейс, .net core = class; если вы кодируете против класса, вы не получите больше методов (и т. д.), но вы ограничены этим конкретным типом (и потомками); если вы используете интерфейс, вы можете получить меньшую поверхность, но он будет работать против произвольных реализаций ... пока эти реализации делают то, что ожидается :) да, ядро ​​.net нацелено на несколько платформ, но существуют другие реализации стандарта .net   -  person Marc Gravell    schedule 20.05.2017
comment
.NETStandard - это замена PCL. Портативная библиотека классов помогла вам написать библиотеку, которая может работать на нескольких платформах (телефон, рабочий стол, магазин, браузер, Xbox и т. Д.). Он не очень хорошо масштабировался, сильно пострадал от n! проблема, поэтому они отказались от нее. .NETCore - это только первая созданная ими среда разработки, она была самой простой, остальное должно наверстать упущенное. Имейте в виду, что это очень большая работа, и в .NETStandard v2.0 впереди большие изменения. Стандарт, чтобы править ими всеми, на данный момент :)   -  person Hans Passant    schedule 20.05.2017
comment
Пожалуйста, не добавляйте лишних вопросов к существующему. Ваш вопрос в редактировании отдельно от этого.   -  person Jon Skeet    schedule 21.05.2017
comment
@JonSkeet Тогда я должен открыть новый вопрос? Спасибо за совет. потому что сначала я открыл новый вопрос о многотаргетинге .net Core, и мне отказали, потому что они сказали, что это повторяющийся вопрос.   -  person Álvaro García    schedule 21.05.2017
comment
@ ÁlvaroGarcía: Да, но проясни - твой текущий вопрос, состоящий из одного предложения, мне совсем не понятен.   -  person Jon Skeet    schedule 21.05.2017
comment
@JonSkeet Разве в новом вопросе не ясно, что меня открыли, или в этом вопросе? Новый вопрос таков: stackoverflow.com/questions/44094932/ Спасибо.   -  person Álvaro García    schedule 21.05.2017
comment
Просто интересно, как .NET Standard соотносится с полной платформой .NET, которая включает классы, не относящиеся к UWP, то есть классы в _ 1_, которые действительно не имеют никакой официальной поддержки на платформах, отличных от Windows? Должен ли я просто вызвать фреймворк, включающий System.Drawing .NET, или он называется как-то еще? По теме: стенограмма чата   -  person jrh    schedule 23.05.2017


Ответы (7)


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

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

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

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

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

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

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

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

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

person Federico Dipuma    schedule 20.05.2017
comment
Большое спасибо за это. Но у меня есть сомнения. Если стандарт .net является интерфейсом и может быть реализован, например, с помощью .net framework и .net Core, когда я создаю стандартную библиотеку классов .net и использую эту библиотеку в другом проекте, какая реализация используется, net framework или .net Основной? - person Álvaro García; 20.05.2017
comment
Он будет использовать реализацию скомпилированного приложения (каким бы оно ни было). Если вы скомпилируете приложение NET core, оно будет использовать библиотеки ядра NET (которые являются реализацией стандарта NET). - person Federico Dipuma; 20.05.2017
comment
Эта диаграмма является отличным подспорьем для иллюстрации взаимосвязи ядро ​​/ стандарт / фреймворк. - person jasper; 10.08.2017
comment
Поэтому, если я создам консольное приложение net461 и нацелен на библиотеку netstandard2.0, ничего из этой стандартной библиотеки не разрешится в консольном приложении. Так... ?? - person Sinaesthetic; 30.08.2017
comment
@Sinaesthetic, не могли бы вы рассказать подробнее? Я не понимаю вашего вопроса. - person Federico Dipuma; 30.08.2017
comment
Если netstandard2.0 реализован в net461, как показывает диаграмма совместимости, то почему net461 не может ссылаться на библиотеку netstandard2.0? - person Sinaesthetic; 31.08.2017
comment
Значит, различия можно свести к диаграмме Венна между x количеством конкретных фреймворков, где перекрытие между ними составляет .NET Standard? - person Panzercrisis; 10.11.2017
comment
Одна картинка стоит тысячи слов - person Nikaas; 04.10.2018

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

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

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

person Jon Skeet    schedule 20.05.2017
comment
Но, согласно таблице реализации, .net Core 1.0 реализует, например, .net Standard 1.6, поэтому, я думаю, он должен быть совместим с Mono 4.6. - person Álvaro García; 20.05.2017
comment
@ ÁlvaroGarcía: Что вы имеете в виду, говоря, что он должен быть совместимым? .NET Core 1.0? Не обязательно - потому что .NET Core 1.0 все еще может включать дополнительные вещи. Эта запись означает, что если вы нацеливаетесь на .NET Standard 1.6, вы можете запускать код как под Mono 4.6 , так и .NET Core 1.0. - person Jon Skeet; 20.05.2017
comment
С совместимым я имею в виду, что могу использовать свою библиотеку .net Core с Mono. Но если .net Core имеет больше вещей, несовместимых с Mono, почему .net Core считается кроссплатформенным? docs.microsoft.com/en-us/dotnet/articles/core Здесь говорится, что .net Core совместим с Xamarin и Mono через .net Standard. - person Álvaro García; 20.05.2017
comment
Вы не можете запустить сборку .NET Core ни на чем, кроме .NET Core (CoreCLR и CoreFX). Вы можете запустить сборку .NET Standard на любой платформе, которая соответствует договорным обязательствам по соответствующему стандарту (1.3, 1.6, 2.0 и т. Д.). - person Mark Rendle; 20.05.2017
comment
Кросс-платформенность относится к операционной системе, а не к фреймворку. - person Mark Rendle; 20.05.2017
comment
В качестве аналогии попробуйте представить .NET Standard как интерфейс (например, INetStandard16). .NET Core 1.0 и Mono 4.6 реализуют INetStandard16. Вы не можете конвертировать .Net Core 1.0 в Mono 4.6 (и наоборот), но все, что использует INetStandard16, будет работать с обоими. (кредиты Дэвида Фаулера) - person Federico Dipuma; 20.05.2017
comment
Кстати, краткое изложение различных библиотек классов, которые вы можете создать, blog.lextudio.com/ Библиотеки классов .NET Standard предпочтительнее в большинстве случаев. - person Lex Li; 20.05.2017
comment
Это меня удивило. Имена кажутся перевернутыми. Вы могли бы подумать, что что-то под названием core будет более минимальным из двух ... - person jpmc26; 21.05.2017
comment
Я думаю, энтропия началась. - person JustJohn; 26.05.2017
comment
Зачем нам нужны другие ответы, кроме этого? - person Ray Cheng; 15.12.2017

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

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

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

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

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

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

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

person Nipuna    schedule 24.04.2019

Библиотека .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 может вам в этом помочь.

person user2771704    schedule 16.08.2017

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

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


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

person steliosalex    schedule 05.10.2017

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

person Waleed Naveed    schedule 05.08.2019

Вы имели в виду .NET Framework? Поскольку стандарт .NET - это такие реализации, как .NET Framework, .NET Core и Xamarin.

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

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

person Fityan Aula    schedule 17.02.2018