В чем разница? between.NET Керн and.NET стандартные типы проектов библиотеки классов?


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

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

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

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

8 438

8 ответов:

когда следует использовать один над другим?

решение является компромиссом между совместимостью и доступом к API.

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

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

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

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

раздел фреймворков на основе пакетов здесь описывает разницу.

совместимость: библиотек, предназначенных .Чистый стандарт будет работать на любой .Объем стандартной среды выполнения уступчивый, например .Чистые ядра .Чистая рамок, моно и Xamarin. С другой стороны, библиотеки, предназначенные для .NET Core, могут работать только на .NET Основная среда выполнения.

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

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

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

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

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

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

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

.Net Core, Xamarin и .Net Framework поэтому можно определить как блюда of .Net Standard

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

Microsoft также рекомендует использовать .NET Standard вместо Переносной Библиотеки Классов.

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

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, и Xamarin. Для.NET Core этот добавит многие из существующих API это было запрошено.
  4. .NET Standard 2.0 включает прокладку совместимости для.NET Framework двоичные файлы, значительно увеличивающие набор библиотек, на которые можно ссылаться из стандартных библиотек .NET.
  5. .NET Standard заменит портативные библиотеки классов (PCLs) как история инструментов для построения многоплатформенных .NET библиотеки.

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

источники: MSDN: представляем .Net Standard

поэтому короткий ответ будет:

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

.Net Framework и .Net Core это две разные реализации среды выполнения .Net. Как ядро, так и фреймворк (но особенно фреймворк) имеют разные профили, которые включают большие или меньшие (или просто разные) выборы многих API и сборок, созданных Microsoft для .Net, в зависимости от того, где они установлены и в каком профиле. Например, есть несколько различных 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 и т. д. Пока среда выполнения обеспечивает поддержку этой версии стандарта, вы можете компилировать и запускать там.

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

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

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

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

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

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

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

.NET Framework и .NET Core-это обе платформы.

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

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

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

надеюсь, что это поможет понять связь между .NET Standard API surface и другими платформами .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
}
}

источник