В чем разница между типами проектов .NET Core и .NET Standard Class?

В Visual Studio есть как минимум 3 разных типа библиотек классов, которые вы можете создать:

  • Библиотека классов (.NET Framework)
  • Библиотека классов (.NET Standard)
  • Библиотека классов (.NET Core)

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

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

Ответ 1

Когда мы должны использовать один над другим?

Решение - это компромисс между совместимостью и доступом к API.

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

Используйте библиотеку .NET Core, когда вы хотите увеличить площадь поверхности .NET API, к которой ваша библиотека может получить доступ, и вы можете позволить совместимым только приложениям .NET Core с вашей библиотекой.

Например, библиотека, ориентированная на .NET Standard 1.3, будет совместима с приложениями, ориентированными на .NET Framework 4.6,.NET Core 1.0, универсальную платформу Windows 10.0 и любую другую платформу, поддерживающую .NET Standard 1.3. Однако библиотека не будет иметь доступа к некоторым частям .NET API. Например, пакет Microsoft.NETCore.CoreCLR совместим с .NET Core, но не с .NET Standard.

В чем разница между библиотекой классов (.NET Standard) и библиотекой классов (.NET Core)?

В разделе Основанные на пакетах разделы описывают разницу.

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

Площадь поверхности API: библиотеки .NET Standard поставляются со всем в NETStandard.Library тогда как библиотеки .NET Core поставляются со всем в Microsoft.NETCore.App. Последняя включает в себя около 20 дополнительных библиотек, некоторые из которых мы можем добавить вручную в нашу библиотеку .NET Standard (например, System.Threading.Thread), а некоторые из них не совместимы с .NET Standard (например, Microsoft.NETCore.CoreCLR).

Кроме того, библиотеки .NET Core определяют среду выполнения и поставляются с моделью приложения. Это важно, например, чтобы сделать библиотеки классов модульного тестирования работоспособными.

Почему оба существуют?

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

Возвращаясь к библиотекам, шаблоны библиотек .NET Standard существуют для работы в нескольких средах исполнения (за счет площади поверхности API). С другой стороны, шаблоны библиотеки .NET Core существуют для доступа к большей площади поверхности API (за счет совместимости) и для определения платформы, на которой можно создать исполняемый файл.

Ответ 2

.Net Core Class Library создана на основе .Net Standard. Если вы хотите реализовать библиотеку, переносимую на .Net Framework,.Net Core и Xamarin, выберите .Net Standard Library

.Net Core в конечном итоге будет реализовывать .Net Standard 2 (как и Xamarin и .Net Framework)

Поэтому .Net Core, Xamarin и .Net Framework можно идентифицировать как разновидности из .Net Standard

Чтобы в будущем ваши приложения могли обмениваться и повторно использовать код, вам лучше использовать библиотеки .Net Standard.

Microsoft также рекомендует использовать .NET Standard вместо переносимых библиотек классов.

Чтобы цитировать MSDN как авторитетный источник, .Net Standard должен быть единой библиотекой, управляющей ими всеми. Поскольку картинки стоят тысячи слов, следующее будет очень понятно:

1. Ваш текущий сценарий приложения (фрагментированный)

Как и большинство из нас, вы, вероятно, в ситуации ниже: (.Net Framework, Xamarin, а теперь и .Net Core приложения)

enter image description here

2. Что для вас обеспечит стандартная библиотека .Net (кросс-каркасная совместимость)

Реализация стандартной библиотеки .Net позволяет совместно использовать код для всех этих различных вариантов:

One Library to Rule them All

Для нетерпеливых:

  1. .NET Standard решает проблему совместного использования кода для разработчиков .NET на всех платформах, предоставляя все API, которые вы ожидаете и любите, в нужных вам средах: настольные приложения, мобильные приложения и игры и облачные сервисы:
  2. .NET Standard - это набор API, который все платформы .NET должны реализовывать. Это объединяет платформы .NET и предотвращает будущую фрагментацию.
  3. .NET Standard 2.0 будет реализован .NET Framework,.NET Core, и Хамарин. Для .NET Core это добавит многие существующие API которые были запрошены.
  4. .NET Standard 2.0 включает в себя оболочку совместимости для двоичных файлов .a Framework, что значительно расширяет набор библиотек, на которые можно ссылаться из своих библиотек .NET Standard.
  5. .NET Standard заменитпереносные библиотеки классов (PCL) в качестве история инструментов для создания мультиплатформенных библиотек .NET.

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

Источники: MSDN: внедрение стандарта .Net

Ответ 3

Таким образом, короткий ответ будет:

IAnimal == .NetStandard (General)
ICat == .NetCore (Less General)
IDog == .NetFramework (Specific / oldest and has the most features)

Ответ 4

.Net Framework и .Net Core являются двумя различными реализациями среды выполнения.Net. И Core, и Framework (но особенно Framework) имеют разные профили, которые включают большие или меньшие (или просто разные) варианты множества API и сборок, созданных Microsoft для.Net, в зависимости от того, где они установлены и в каком профиле. Например, в универсальных приложениях Windows доступно несколько других API, чем в "обычном" профиле Windows. Даже в Windows у вас может быть профиль "Клиент" против профиля "Полный". Кроме того, существуют другие реализации (например, Mono), которые имеют свои собственные наборы библиотек.

.Net Standard - это спецификация, для которой должны быть доступны наборы библиотек API и сборок. Приложение, написанное для.Net Standard 1.0, должно быть способным компилироваться и работать с любой версией Framework, Core, Mono и т.д., Которая рекламирует поддержку коллекции библиотек.Net Standard 1.0. Аналогичное верно для.Net Standard 1.1, 1.5, 1.6, 2.0 и т.д. Если среда выполнения обеспечивает поддержку версии Standard, на которую ориентирована ваша программа, ваша программа должна работать там.

Проект, нацеленный на версию стандарта, не сможет использовать функции, которые не включены в эту редакцию стандарта. Это не означает, что вы не можете использовать зависимости от других сборок или API, опубликованных другими поставщиками (например, элементы в NuGet). Но это означает, что любые зависимости, которые вы принимаете, должны также включать поддержку вашей версии.Net Standard. .Net Standard быстро развивается, но все еще достаточно новый и достаточно заботится о некоторых из меньших профилей времени выполнения, так что это ограничение может чувствовать себя удушающим. (Обратите внимание, полтора года спустя: это начинает меняться, и последние версии.Net Standard гораздо приятнее и полнее).

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

.Net Standard также может быть полезен в ситуациях, когда команда SysAdmin хочет перейти с ASP.Net для Windows на ASP.Net для.Net Core для Linux по философским соображениям или по соображениям стоимости, но команда разработчиков хочет продолжить работу с.Net Фреймворк в Visual Studio на Windows.

Ответ 5

.NET Framework и.NET Core - это фреймворки.

Стандарт.NET - это стандарт (другими словами, спецификация).

Вы можете создать исполняемый проект (например, консольное приложение или приложение ASP.NET) с помощью.NET Framework и.NET Core, но не с.NET Standard.

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

Ответ 6

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

namespace Analogy
{
  // .NET Standard

interface INetStandard10
{
    void Primitives();
    void Reflection();
    void Tasks();
    void Xml();
    void Collections();
    void Linq();
}

interface INetStandard11 : INetStandard10
{
    void ConcurrentCollections();
    void LinqParallel();
    void Compression();
    void HttpClient();
}

interface INetStandard12 : INetStandard11
{
    void ThreadingTimer();
}

interface INetStandard13 : INetStandard12
{
    //.NET Standard 1.3 specific APIs
}

// And so on ...


// .NET Framework 

interface INetFramework45 : INetStandard11
{
    void FileSystem();
    void Console();
    void ThreadPool();
    void Crypto();
    void WebSockets();
    void Process();
    void Drawing();
    void SystemWeb();
    void WPF();
    void WindowsForms();
    void WCF();
}

interface INetFramework451 : INetFramework45, INetStandard12
{
    // .NET Framework 4.5.1 specific APIs
}

interface INetFramework452 : INetFramework451, INetStandard12
{
    // .NET Framework 4.5.2 specific APIs
}

interface INetFramework46 : INetFramework452, INetStandard13
{
    // .NET Framework 4.6 specific APIs
}

interface INetFramework461 : INetFramework46, INetStandard14
{
    // .NET Framework 4.6.1 specific APIs
}

interface INetFramework462 : INetFramework461, INetStandard15
{
    // .NET Framework 4.6.2 specific APIs
}

// .NET Core
interface INetCoreApp10 : INetStandard15
{
    // TODO: .NET Core 1.0 specific APIs
}
// Windows Universal Platform
interface IWindowsUniversalPlatform : INetStandard13
{
    void GPS();
    void Xaml();
}

// Xamarin 
interface IXamarinIOS : INetStandard15
{
    void AppleAPIs();
}

interface IXamarinAndroid : INetStandard15
{
    void GoogleAPIs();
}    
// Future platform

interface ISomeFuturePlatform : INetStandard13
{
    // A future platform chooses to implement a specific .NET Standard version.
    // All libraries that target that version are instantly compatible with this new
    // platform
}
}

Источник

Ответ 7

Другой способ объяснить разницу может быть на реальных примерах, так как большинство из нас, смертных, будут использовать существующие инструменты и структуры (Xamarin, Unity и т.д.) Для выполнения этой работы.

Итак, с.NET Framework у вас есть все инструменты.NET для работы, но вы можете ориентироваться только на приложения Windows (UWP, Winforms, ASP.NET и т.д.). Поскольку.NET Framework является закрытым исходным кодом, с этим ничего не поделаешь.

С.NET Core у вас меньше инструментов, но вы можете ориентироваться на основные настольные платформы (Windows, Linux, Mac). Это особенно полезно в приложениях ASP.NET Core, поскольку теперь вы можете размещать Asp.net в Linux (более дешевые цены на хостинг). Теперь, так как.NET Core был открытым исходным кодом, технически стало возможным разрабатывать библиотеки для других платформ. Но поскольку нет фреймворков, поддерживающих его, я не думаю, что это хорошая идея.

С.NET Standard у вас еще меньше инструментов, но вы можете ориентироваться на все/большинство платформ. Вы можете настроить таргетинг на мобильные устройства благодаря Xamarin, а также можете настроить таргетинг на игровые приставки благодаря Mono/Unity.

В реальных приложениях вам может понадобиться использовать их все. Например, я разработал приложение для точек продаж со следующей архитектурой:

Совместное использование как сервера, так и клиента:

  • Стандартная библиотека.NET, которая обрабатывает модели моего приложения.

Поскольку это стандартная библиотека.NET, ее можно использовать в любой другой библиотеке.

Сторона сервера (веб-API):

  • Библиотека.NET Standard (также может быть Core), которая обрабатывает все соединения с базой данных.

  • Проект.NET Core, который обрабатывает Rest API и использует библиотеку базы данных.

Поскольку это разработано в.NET Core, я могу разместить приложение на сервере Linux.

Клиентская часть (MVVM с WPF + Xamarin.Forms для Android/IOS):

  • Стандартная библиотека.NET, которая обрабатывает клиентское соединение API.

  • Стандартная библиотека.NET, которая обрабатывает логику ViewModels. Используется во всех видах.

  • Приложение.NET Framework WPF, которое обрабатывает представления WPF для приложения Windows.

  • Стандартная библиотека.NET, которая обрабатывает представления Xamarin Forms.

  • Проект Xamarin для Android и Xamarin IOS.

Таким образом, вы можете видеть, что здесь есть большое преимущество в клиентской части приложения, поскольку я могу повторно использовать обе стандартные библиотеки.NET(Client API и ViewModels) и просто создавать представления без какой-либо логики для приложений WPF, Xamarin и IOS.

Ответ 8

Стандарт.NET: думайте об этом как о большой стандартной библиотеке. При использовании этого в качестве зависимости вы можете создавать только библиотеки (.DLL), но не исполняемые файлы. Библиотека, созданная на основе стандарта.NET, может быть добавлена в проект Xamarin.Android, Xamarin.iOS,.NET Core для Windows/OSX/Linux.

.NET Core: воспринимайте его как продолжение старой платформы.NET, просто он с открытым исходным кодом, а некоторые вещи еще не реализованы, а другие устарели. Он расширяет стандарт.NET дополнительными функциями, но работает только на настольных компьютерах. При добавлении этого в качестве зависимости вы можете создавать работающие приложения в Windows, Linux и OSX. (Хотя консоль только пока, без графического интерфейса). Так..NET Core =.NET Standard + настольные вещи.
Также UWP использует его, и новое ядро ASP.NET также использует его как зависимость.

Ответ 9

.Net Standard существует в основном для улучшения совместного использования кода и повышения доступности API в каждой реализации .Net.

При создании библиотек мы можем иметь целевой стандарт .NET 2.0, чтобы созданная библиотека была совместима с различными версиями .NET Framework, включая .NET Core, Mono..

Ответ 10

.NET CORE.NET Core - это бесплатная кроссплатформенная реализация управляемой среды с открытым исходным кодом. Он поддерживает четыре типа приложений: консоль, ASP.NET Core, облако и универсальная платформа Windows (UWP). Windows Forms и Windows Presentation Foundation (WPF) не являются частью.NET Core.

Стандарт.NET Каждая реализация управляемой инфраструктуры имеет свой собственный набор библиотек базовых классов. Библиотека базовых классов (BCL) содержит классы, такие как обработка исключений, строки, XML, ввод-вывод, работа в сети и коллекции.

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

Библиотеки классов инфраструктуры (FCL), такие как WPF, WCF и ASP.NET, не являются частью BCL и, следовательно, не включены в стандарт.NET.

Связь между.NET Standard и реализацией.NET такая же, как между спецификацией HTML и браузером. Второе - это реализация первого.

Ответ 11

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

.NET Core - это бесплатная управляемая программная среда с открытым исходным кодом для операционных систем Windows, Linux и macOS.

.NET Framework - это программная среда, которая работает в основном в Microsoft Windows.

Ответ 12

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

В проекте, который вам нужно смешать между .NET Framework,.NET Core и .NET Standard. Например, в то время, когда мы собираем систему с .NET Core 1.0, нет поддержки оконных служб с .net core.

Следующая причина в том, что мы использовали Active Report, который не поддерживает .NET Core. Поэтому мы хотим создать инфраструктурную библиотеку, которая может использоваться как для .NET Core (ядро asp.net), так и для службы Windows и отчетности (.NET Framework) → Именно поэтому мы выбрали .NET Standard для этой библиотеки. Выбор стандарта .NET означает, что вам нужно тщательно продумать, что каждый класс в библиотеке должен быть простым и перекрестным .NET (ядро, фреймворк, стандарт).

Заключение:

  • Стандарт .NET для инфраструктуры библиотеки и общего доступа. На эту библиотеку могут ссылаться .NET Framework и .NET Core.
  • .NET Framework для неподдерживаемых технологий, таких как Active Report, Window Services (теперь он поддерживает .NET 3.0).
  • .NET Core для ASP.NET Core, конечно.

Microsoft только что анонсировала .NET 5: https://devblogs.microsoft.com/dotnet/introduction-net-5/

Ответ 13

.NET Standard является общей частью .NET Framework и .NET Core

Цитата:

Библиотеки быстро переходят на стандарт .NET..NET Standard позволяет совместное использование кода во всех реализациях .NET, включая .NET Core. С участием .NET Standard 2.0, это еще проще:

  • Поверхность API стала намного больше.

  • Представлен .NET Framework режим совместимости. Этот режим совместимости позволяет .NET Standard/.NET Основные проекты для ссылки на библиотеки .NET Framework. Узнать больше о режиме совместимости см. объявление о стандарте .NET Standard 2.0.

Так только в тех случаях, когда библиотеки или пакеты NuGet используют технологии которые недоступны в .NET Standard/.NET Core, вам нужно использовать .NET Framework.

Источник: https://docs.microsoft.com/en-us/dotnet/standard/choosing-core-framework-server#a-need-to-use-third-party-net-libraries-or-nuget-packages-not-available-for-net-core

Например, RabbitMQ использует .NET Standard: https://www.rabbitmq.com/dotnet.html

Расширенная информация с помощью .NET 5:

Нужен ли нам еще .NET Standard? Мы работаем над этими вопросами сейчас и в скором времени будем делиться документами по дизайну для вас, чтобы прочитать и дать Отзыв о.

Источник: https://devblogs.microsoft.com/dotnet/introducing-net-5/

Ответ 14

.NET Framework Приложения Windows Form, ASP.NET и WPF должны разрабатываться с использованием библиотеки .NET Framework

.NET Standard Приложения Xamarin, IO и MAC OSx должны разрабатываться с использованием библиотеки .NET Standard

.NET Core
Универсальная платформа Windows (UWP) и приложение Linux должны разрабатываться с использованием библиотеки .NET Core. API реализован в C++, и вы можете использовать языки C++, VB.NET, С#, F # и Javascript.NET