.NET Core和.NET标准类库项目类型有什么区别?

时间:2017-03-21 22:34:24

标签: .net .net-core class-library .net-standard

在Visual Studio中,您可以创建至少3种不同类型的类库:

  • 类库(.NET Framework)
  • 类库(.NET标准)
  • 类库(.NET Core)

虽然第一个是我们多年来一直使用的,但我遇到的一个主要问题是何时使用.NET Standard和.NET Core类库类型。在尝试multi-target different framework versionscreating a unit test project时,我最近一直对此感到厌烦。

那么,类库(.NET标准)类库(.NET Core)之间有什么区别,为什么两者都存在,我们什么时候应该使用一个在另一个?

15 个答案:

答案 0 :(得分:458)

  

我们什么时候应该使用另一个?

决定是在兼容性和API访问之间进行权衡。

如果要增加与库兼容的应用程序数量,请使用.NET标准库,并且可以减少库可以访问的.NET API表面区域。

如果要增加库可以访问的.NET API表面区域,请使用.NET Core库,并且只允许.NET Core应用程序与您的库兼容。

例如,一个针对.NET Standard 1.3 will be compatible with应用程序的库,这些应用程序面向.NET Framework 4.6,.NET Core 1.0,Universal Windows Platform 10.0以及支持.NET Standard 1.3的任何其他平台。但是,该库无法访问.NET API的某些部分。例如,Microsoft.NETCore.CoreCLR包与.NET Core兼容,但与.NET Standard不兼容。

  

类库(.NET标准版)和类库(.NET Core)之间有什么区别?

The Package-based frameworks section描述了差异。

兼容性:面向.NET Standard的库将在任何符合.NET标准的运行时上运行,例如.NET Core,.NET Framework,Mono / Xamarin。另一方面,面向.NET Core的库只能在.NET Core运行时上运行。

API表面区域:.NET标准库包含NETStandard.Library中的所有内容,而.NET Core库附带Microsoft.NETCore.App中的所有内容。后者包括大约20个额外的库,其中一些我们可以手动添加到我们的.NET标准库(例如System.Threading.Thread),其中一些与.NET标准不兼容(例如Microsoft.NETCore.CoreCLR )。

此外,.NET Core库指定运行时并附带应用程序模型。例如,重要的是使单元测试类库可以运行。

  

为什么两者都存在?

暂时忽略库,.NET Standard存在的原因是可移植性;它定义了.NET平台同意实现的一组API。任何实现.NET标准的平台都与面向.NET标准的库兼容。其中一个兼容的平台是.NET Core。

回到库,.NET标准库模板可以在多个运行时上运行(以API表面区域为代价)。相反,.NET Core库模板的存在是为了访问更多的API表面区域(以兼容性为代价)并指定一个用于构建可执行文件的平台。

答案 1 :(得分:316)

.Net核心类库建立在 .Net标准之上。如果要实现可移植到 .Net Framework ,。 Net Core Xamarin 的库,请选择 .Net标准库

.Net Core最终将实施.Net Standard 2 Xamarin .Net Framework

.Net Core Xamarin .Net Framework 因此可以被识别为风味 < strong> .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 通过在您需要的环境中提供您期望和喜爱的所有API,解决了所有平台上.NET开发人员的代码共享问题:桌面应用程序,移动应用程序和移动应用程序。游戏和云服务:
  2. .NET标准是一组 所有 .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标准 将取代便携式类库(PCL) 用于构建多平台.NET库的工具故事。
  6. 根据您打算在哪个.NET平台上运行head over here,有助于了解可以定位的最高版.NET Standard的表格。

    资料来源:MSDN: Introducing .Net Standard

答案 2 :(得分:76)

所以简短的回答是:

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

答案 3 :(得分:63)

.Net Framework .Net Core 是.Net运行时的两种不同实现。 Core和Framework(尤其是Framework)都有不同的配置文件,包括Microsoft为.Net创建的许多API和程序集的更大或更小(或只是简单的不同)选择,具体取决于它们的安装位置和配置文件。例如,通用Windows应用程序中有一些不同的API可用于&#34; normal&#34; Windows个人资料。即使在Windows上,您也可能拥有&#34;客户端&#34;简介vs&#34; Full&#34;轮廓。此外,还有其他实现(如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标准正在快速发展,但它仍然足够新,并且对一些较小的运行时配置文件足够关注,这种限制可能让人感到窒息。 (注意一年半之后:这种情况开始发生变化,最近的.Net标准版本更加出色,功能更全面。)

另一方面,针对Standard 的应用应该能够在更多部署情况下使用,因为理论上它可以与Core,Framework,Mono等一起运行。对于类库寻求广泛分销的项目,这是一个有吸引力的承诺。对于主要用于内部目的的类库项目,它可能不是一个问题。

.Net Standard在SysAdmin团队希望从Windows上的ASP.Net转移到Linux上的.Net Core for ASP.Net出于哲学或成本原因的情况下也很有用,但开发团队希望继续工作针对Windows上的Visual Studio中的.Net Framework。

答案 4 :(得分:17)

.NET Framework和.NET Core都是框架。

.NET Standard是标准的(换句话说,规范)。

您可以使用.NET Framework和.NET Core创建可执行项目(例如控制台应用程序或ASP.NET应用程序),但不能使用.NET Standard创建该项目。

使用.NET Standard,您只能创建无法独立执行且应由另一个.NET Core或.NET Framework可执行项目引用的类库项目。

答案 5 :(得分:12)

希望这将有助于理解.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
}
}

Source

答案 6 :(得分:9)

.NET标准:将其视为一个重要的标准库。当使用它作为依赖项时,您只能创建库(.DLL),而不是可执行文件。使用.NET标准作为依赖项创建的库可以添加到Xamarin.Android,Xamarin.iOS,.NET Core Windows / OSX / Linux项目中。

.NET Core:将它视为旧.NET框架的延续,只是它的开源,一些东西尚未实现,其他东西已被弃用。它扩展了.NET标准的附加功能,但只能在桌面上运行。将此作为依赖项添加时,您可以在Windows,Linux和OSX上创建可运行的应用程序。 (虽然现在只有控制台,没有GUI)。所以.NET Core = .NET Standard + Desktop特定的东西。
UWP也使用它,新的ASP.NET核心也将它用作依赖。

答案 7 :(得分:8)

<。> .Net Standard主要用于改进代码共享,并使每个.Net实现中的API更加一致。

在创建库时,我们可以定位as.Net Standard 2.0,这样创建的库就可以与不同版本的.Net Framework兼容,包括.Net Core,Mono ..

答案 8 :(得分:8)

解释差异的另一种方法可能是在现实世界中的示例,因为我们大多数人都会使用现有的工具和框架(Xamarin,Unity等)来完成这项工作。

因此,使用.NET Framework,您可以使用所有.NET工具,但只能定位Windows应用程序(UWP,Winforms,ASP.NET等)。由于.NET Framework是封闭源代码,因此无需太多操作。

使用.NET Core,您拥有更少的工具,但是您可以针对主要的桌面平台(Windows,Linux,Mac)。这在ASP.NET Core应用程序中特别有用,因为您现在可以在Linux中托管Asp.net(更便宜的托管价格)。现在,由于.NET Core是开源的,因此在技术上可以为其他平台开发库。但是,由于没有支持它的框架,所以我认为这不是一个好主意。

使用.NET Standard,您拥有甚至更少的工具,但您可以针对所有/大多数平台。您可以通过Xamarin来定位移动平台,甚至可以通过Mono / Unity来定位游戏机。

在现实世界中的应用程序中,您可能需要全部使用它们。例如,我开发了具有以下架构的销售点应用程序:

共享服务器和客户端:

  • 处理我的应用程序模型的.NET标准库。

由于它是.NET标准库,因此可以在任何其他库中使用。

服务器端(Web API):

  • 一个.NET标准库(也可以是Core),可以处理所有 数据库连接。

  • 一个.NET Core项目,该项目处理Rest API并利用 数据库库。

由于它是在.NET Core中开发的,因此我可以将应用程序托管在Linux服务器上。

客户端(带有WPF + Xamarin.Forms Android / IOS的​​MVVM):

  • 处理客户端API连接的.NET标准库。

  • 一个用于处理ViewModels逻辑的.NET标准库。用于 所有视图。

  • 一个.NET Framework WPF应用程序,该应用程序处理以下内容的WPF视图: Windows应用程序。

  • 一个处理Xamarin Forms视图的.NET标准库。

  • 一个Xamarin Android和Xamarin IOS项目。

因此您可以看到应用程序的客户端具有很大的优势,因为我可以重用.NET标准库(客户端API和ViewModels),并且只需为WPF,Xamarin和IOS应用程序创建没有逻辑的视图

答案 9 :(得分:0)

.NET标准是旨在用于所有.NET实现的.NET API的正式规范。

.NET Core 是一个免费的开放源代码的托管计算机软件框架,适用于Windows,Linux和macOS操作系统。

.NET Framework 是主要在Microsoft Windows上运行的软件框架。

答案 10 :(得分:0)

.NET Framework Windows Form,ASP.NET和WPF应用程序必须使用.NET Framework库进行开发

.NET标准 必须使用.NET标准库开发Xamarin,IO和MAC OSx应用程序

.NET Core
通用Windows平台(UWP)和Linux应用程序必须使用.NET Core库进行开发。 该API用C ++实现,您可以使用C ++,VB.NET,C#,F#和Javascript语言。NET

答案 11 :(得分:0)

.Net核心类库基于.Net标准构建。如果要实现可移植到.Net Framework,.Net Core和Xamarin的库,请选择.Net标准库

答案 12 :(得分:0)

.NET Core .NET Core 是托管框架的免费、跨平台、开源实现。它支持四种类型的应用程序:控制台、ASP.NET Core、云和通用 Windows 平台 (UWP)。 Windows 窗体和 Windows Presentation Foundation (WPF) 不是 .NET Core 的一部分。

从技术上讲,.NET Core 仅支持控制台应用程序。 ASP.NET Core 和 UWP 是构建在 .NET Core 之上的应用程序模型。

与 .NET Framework 不同,.NET Core 不被视为 Windows 组件。因此,更新以 NuGet 包的形式出现,而不是通过 Windows 更新。由于 .NET Core 运行时安装在 App-Local 中,并且应用程序通过包管理器进行更新,因此应用程序可以与特定的 .NET Core 版本相关联并单独更新。

.NET 标准 托管框架的每个实现都有自己的一组基类库。基类库 (BCL) 包含异常处理、字符串、XML、I/O、网络和集合等类。

.NET Standard 是实现 BCL 的规范。由于 .NET 实现需要遵循此标准,因此应用程序开发人员不必担心每个托管框架实现的 BCL 版本不同。

WPF、WCF 和 ASP.NET 等框架类库 (FCL) 不是 BCL 的一部分,因此不包含在 .NET Standard 中。

.NET Standard 和 .NET 实现之间的关系与 HTML 规范和浏览器之间的关系相同。第二个是第一个的实现。

因此,.NET Framework、Xamarin 和 .NET Core 都在其托管框架中为 BCL 实现了 .NET Standard。由于计算机行业将继续引入新的硬件和操作系统,因此将有新的 .NET 托管框架。该标准让应用程序开发人员知道他们可以依赖一组一致的 API。

每个 .NET 版本都有一个关联的 .NET Standard 版本。

通过提供一致的 API,可以更轻松地将应用程序移植到不同的托管实现以及提供工具。

.NET Standard 被定义为单个 NuGet 包,因为需要所有 .NET 实现来支持它。工具变得更容易,因为这些工具具有用于给定版本的一致 API 集。您还可以为多个 .NET 实现构建单个库项目。

您还可以为平台特定的 API 构建 .NET Standard 包装器。

答案 13 :(得分:-1)

以上答案可能是对网络核心,网络标准和网络框架之间差异的最佳理解,因此我只想分享自己的经验。

在项目中,您需要在.NET Framework,.NET Core和.NET Standard之间混合使用。例如,当我们使用.NET Core 1.0构建系统时,不支持使用.net Core托管的Window Services。

下一个原因是我们使用的是不支持.NET Core的Active Report。 因此,我们要构建一个可同时用于.NET Core(asp.net核心)和Windows Service and Reporting(.NET Framework)的基础结构库,这就是为什么我们为此类库选择.NET Standard的原因。 选择.NET标准意味着您需要仔细考虑库中的每个类都应该是简单的并且跨.NET(核心,框架,标准)。

结论:

  • .NET Standard用于基础结构库和共享公用。 .NET Framework和.NET Core可以引用此库。
  • .NET Framework,用于不支持的技术,例如Active Report,Window Services(现在支持.NET 3.0)。
  • .NET Core for ASP.NET Core当然。

Microsoft刚刚宣布了.NET 5:https://devblogs.microsoft.com/dotnet/introducing-net-5/

答案 14 :(得分:-1)

每个框架都有自己的类库。

  • .Net Framework 的基类库。
  • .Net 核心的核心库。
  • Xamarin 的 Mono 类库。

Microsoft 已决定将所有这些类库整合到一个可在所有框架中实现的库中。为此,他们开发了 .Net 标准。

微软决定制作一个统一的框架。 .Net 5 是.Net core 和.Net Framework 的统一框架。在 .Net 6 中,他们也将 .Net MAUI 项目下的 Xamarin 与 .Net 合并。

.Net Framework、.Net Core、Xamarin 统一为一个单一的 Framework .Net 6,所以不需要 .Net 标准。 .Net 标准的目标是拥有一个适用于所有框架的库。现在所有框架都合并到 .Net 6 中了。