.NET Standard vs .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 standard = інтерфейс, .net core = class; якщо ви кодуєте проти класу, то ви отримуєте більше методів (тощо), але ви обмежені конкретним типом (і нащадками); якщо ви використовуєте інтерфейс , який ви могли б отримати меншу поверхню, але вона буде працювати проти довільних реалізацій ... до тих пір , поки ці реалізації робити те , що , як очікується :) да, .net основні цілі кілька платформ, але є і інші реалізації .net стандарт
Марк Гравелл

9
.NETStandard є заміною для PCL. Портативна бібліотека класів допомогла вам написати бібліотеку, яка може працювати на більш ніж одній платформі (телефон, робочий стіл, магазин, браузер, xbox тощо). Це не дуже масштабується, погано страждаючи від російської! проблема, тому вони відмовились від неї. .NETCore - це лише перша рамка, яку вони зробили, вона була найпростішою, решта повинна наздогнати. Майте на увазі, що це дуже багато незавершених процесів, великі зміни попереду .NETStandard v2.0. Стандарт, щоб правити ними всім, поки що :)
Ганс Пасант

Будь ласка, не додайте зайвих запитань до наявного. Ваше питання в редакції окремо від цього.
Джон Скіт

1
@JonSkeet Тоді я повинен відкрити нове запитання? Дякую за пораду. тому що спершу я відкрив нове запитання щодо .net Core multi target, і мене оскаржили, оскільки вони сказали, що це повторне питання.
Альваро Гарсія

@ ÁlvaroGarcía: Так, але дайте зрозуміти - ваше поточне односкладне запитання мені зовсім не зрозуміло.
Джон Скіт

Відповіді:


195

Я спробую ще більше прояснити ваші сумніви і поширити відповідь на Джон Скіта.

.NET Standard - це специфікація , тому бібліотека, складена для певної версії .NET Standard, може використовуватися в різних реалізаціях .NET Standard.

Як було сказано в іншому моєму коментарі, хороша аналогія взаємозв'язку між .NET Standard та іншими .NET Standard Implementations (.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)
Federico Dipuma

5
Ця діаграма є чудовою допомогою для ілюстрації взаємозв'язку core / std / frame.
яшма

Отже, якщо я створюю консольний додаток net461 і націлюю на бібліотеку netstandard2.0, нічого із цієї стандартної вкладки не вирішується в консольному додатку. Так... ??
Сінестетик

2
Картина варта тисячі слів
Nikaas

182

.NET Core - це реалізація .NET Standard. Він доступний у декількох операційних системах, але це не те саме - є й інші реалізації .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 тощо).
Марк Rendle

2
Крос-платформа стосується операційної системи, а не фреймворку.
Марк Rendle

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 ускладнює обмін кодом між режимами виконання. Цей код може не працювати для іншого часу виконання (Моно для 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 Standard, якою ви хочете ділитися між режимами виконання, тоді націліть на найнижчу версію, яку ви можете , що допоможе вам досягти більшості платформ. Наприклад, якщо ви хочете працювати на .NET Framework 4.5 та .NET Core 1.0, найвищою версією .NET Standard, яку ви можете скористатися, є .NET Standard 1.1. Щоб отримати докладнішу інформацію, зверніться до цієї чудової таблиці з документації .

PS: Також, якщо ви хочете перетворити свою бібліотеку в .NET Standard, аналізатор портативності .NET може допомогти вам у цьому.


4

.NET Standard - це специфікація .NET API, призначена для доступу до .NET-реалізацій. Це дозволяє визначити єдиний набір API BCL для всіх реалізацій .NET.

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

Зображення з .NET Blog

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

Відповідь Federicos дає графічний огляд того, як кожен фреймворк розвивається з версіями. Подивіться нижче на схему від Microsoft Docs .

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

Націлювання .NET Standard збільшує підтримку вашої платформи, тоді як націлювання на певну .NET платформу, таку як .NET Core (або .NET Framework), дозволить вам використовувати всі функції платформи для цієї платформи.


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


0

Ви мали на увазі .NET Framework? Тому що стандарт .NET - це такі реалізації, як .NET Framework, .NET Core та Xamarin.

Я люблю .NET Core, тому що ми можемо розмістити його в Linux (використовуйте nginx на моєму досвіді). Це інше, ніж .NET Framework, який ви можете розміщувати лише на IIS. Ви можете розглянути питання про розміщення бюджету на хостинг у цьому випадку (Тому що сервер Windows дорогий для мене).

З точки зору середовища розробки , .Net core є легким. Отже, ви можете використовувати VSCode, Sublime, для IDE (не тільки візуальної студії).


0

Простіше кажучи, .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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.