协慌网

登录 贡献 社区

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

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

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

尽管第一个是我们多年来一直在使用的东西,但是我一直感到困惑的主要点是何时使用. NET Standard 和. NET Core 类库类型。最近,当我尝试多目标化不同的框架版本创建一个单元测试项目时,我为此而感到痛苦。

那么, 类库(.NET Standard)类库(.NET Core)有什么区别,为什么两者都存在,以及何时应在另一个之上使用?

答案

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

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

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

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

例如,面向. NET Standard 1.3 的库将与面向. 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 Standard)和类库(.NET Core)有什么区别?

基于软件包的框架部分描述了差异。

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

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

此外,.NET Core 库指定运行时,并附带一个应用程序模型。例如,这对于使单元测试类库可运行非常重要。

为什么两者都存在?

暂时忽略库,.NET Standard 存在的原因是为了可移植性。它定义了. NET 平台同意实施的一组 API。任何实现. NET Standard 的平台都与针对该. NET Standard 的库兼容。 .NET Core 是这些兼容平台之一。

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

在这里,您将找到一个交互式矩阵,以查看哪些. Net Standard 支持哪些. Net 实现以及可用的 API 数量。

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

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

达网络核心 ,Xamarin.Net Framework可以,因此,被识别为达网络标准口味

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

Microsoft 还建议您使用.NET Standard而不是可移植类库

为了引用 MSDN 作为权威来源, .Net Standard旨在成为一个统治一切的图书馆 。由于图片值一千个字,因此以下内容将使您很清楚:

1. 您当前的应用场景(碎片化)

像我们大多数人一样,您可能处于以下情况:(.Net Framework,Xamarin 和现在的. Net Core 风格的应用程序)

在此处输入图片说明

2. .Net 标准库将为您提供什么(跨框架兼容性)

实施. Net 标准库可实现所有这些不同类型的代码共享:

一个图书馆统治一切

对于急躁的人:

  1. .NET Standard通过在所需的环境(台式机应用程序,移动应用程序和游戏以及云服务)中引入您期望并喜欢的所有 API,为所有平台上的. NET 开发人员解决了代码共享问题。
  2. .NET Standard所有 .NET 平台都必须实现的组 API 。这将统一. NET 平台防止将来出现碎片
  3. .NET Standard 2.0将由.NET Framework实现。 NET CoreXamarin 。对于.NET Core ,这将添加许多已请求的现有 API。
  4. .NET Standard 2.0包括针对.NET Framework二进制文件的兼容性填充程序 ,大大增加了可从. NET Standard 库引用的库集。
  5. .NET Standard 将取代可移植类库(PCL)作为构建多平台. NET 库的工具。

要获得一张表格,以帮助您了解打算基于哪个. NET 平台运行的. NET Standard 的最高版本,请访问此处

来源: MSDN:.Net 标准简介

因此,简短的答案是:

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