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

问题描述 投票:603回答:10

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

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

虽然第一个是我们多年来一直使用的,但我遇到的一个主要问题是何时使用.NET Standard和.NET Core类库类型。我最近在试图加入multi-target different framework versionscreating a unit test project时被这种方式所困扰。

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

.net .net-core class-library .net-standard
10个回答
445
投票

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

该决定是兼容性和API访问之间的权衡。

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

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

例如,一个面向.NET Framework 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表面区域(以兼容性为代价)并指定用于构建可执行文件的平台。


0
投票

.NET标准是.NET API的正式规范,旨在提供给所有.NET实现。

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

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


307
投票

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

.Net Core最终将实施.Net Standard 2(Xamarin和.Net Framework也将如此)

因此,.Net Core,Xamarin和.Net Framework可以被识别为.Net Standard的风格

为了使您的代码共享和重用应用程序能够面向未来,您宁愿实现.Net标准库。

Microsoft还建议您使用.NET Standard而不是Portable Class Libraries。

引用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 Standard是一组所有.NET平台必须实现的API。这统一了.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将取代可移植类库(PCL)作为构建多平台.NET库的工具故事。

有关表格的信息,请参阅head over here,了解您可以根据要运行的.NET平台确定最高版本的.NET标准。

资料来源:MSDN: Introducing .Net Standard


75
投票

所以简短的回答是:

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

60
投票

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

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

.Net标准也适用于SysAdmin团队由于哲学或成本原因而希望从Windows上的ASP.Net迁移到Linux上的.Net Core的ASP.Net的情况,但开发团队希望继续反对.Net Windows上Visual Studio中的框架。


16
投票

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

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

您可以使用.NET Framework和.NET Core制作可执行项目(如Console应用程序或ASP.NET应用程序),但不能使用.NET Standard。

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


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


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
投票

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

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


7
投票

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

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

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

使用.NET Standard,您可以使用更少的工具,但可以定位所有/大多数平台。你可以通过Xamarin来定位Mobile,你甚至可以通过Mono / Unity来定位Game Consoles。

在实际应用程序中,您可能需要使用所有这些应用程序。例如,我开发了具有以下架构的销售点应用程序:

共享服务器和客户端:

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

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

服务器端(Web API):

  • .NET标准(也可以是Core)库,用于处理所有数据库连接。
  • 一个.NET Core项目,它处理Rest API并使用数据库库。

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

客户端(MVF与WPF + Xamarin.Forms Android / IOS):

  • 用于处理客户端API连接的.NET标准库。
  • 用于处理ViewModels Logic的.NET标准库。用于所有视图。
  • 一个.NET Framework WPF应用程序,用于处理Windows应用程序的WPF视图。
  • 用于处理Xamarin Forms视图的.NET标准库。
  • Xamarin Android和Xamarin IOS项目。

所以你可以看到在应用程序的客户端有一个很大的优势,因为我可以重用.NET标准库(Client API和ViewModels),只是为WPF,Xamarin和IOS应用程序创建没有逻辑的视图。


推荐问答