.NET Standard是 .NET API 的正式规范,可用于多个 .NET 实现。.NET Standard 背后的动机是在 .NET 生态系统中建立更大的统一性。如果要在 .NET Framework 和任何其他 .NET 实现(例如 .NET Core)之间共享代码,则库应面向 .NET Standard 2.0。
.NET 5 及更高版本采用不同的方法来建立统一性,从而在许多情况下不再需要 .NET Standard。有关详细信息,请参阅本文后面的.NET 5+ 和 .NET Standard。
.NET 实现支持
各种 .NET 实现针对特定版本的 .NET Standard。每个 .NET 实现版本都宣传它支持的最高 .NET Standard 版本,这一声明意味着它也支持以前的版本。例如,.NET Framework 4.6 实现了 .NET Standard 1.3,这意味着它公开了 .NET Standard 版本 1.0 到 1.3 中定义的所有 API。同样,.NET Framework 4.6.1 实现了 .NET Standard 1.4,而 .NET 5 实现了 .NET Standard 2.1。
下表列出了支持每个 .NET Standard 版本的最低实现版本。这意味着列出的实现的更高版本也支持相应的 .NET Standard 版本。例如,.NET Core 2.1 及更高版本支持 .NET Standard 2.0 及更早版本。
.NET 实现支持
.NET 标准 1.0 1.1 1.2 1.3 1.4 1.5 1.6 2.0 2.1
.NET 和 .NET 核心 1.0 1.0 1.0 1.0 1.0 1.0 1.0 2.0 3.0
.NET 框架1 4.5 4.5 4.5.1 4.6 4.6.1 4.6.1 2 4.6.1 2 4.6.1 2 不适用3
单核细胞增多症 4.6 4.6 4.6 4.6 4.6 4.6 4.6 5.4 6.4
Xamarin.iOS 10.0 10.0 10.0 10.0 10.0 10.0 10.0 10.14 12.16
Xamarin.Mac 3.0 3.0 3.0 3.0 3.0 3.0 3.0 3.8 5.16
安卓系统 7.0 7.0 7.0 7.0 7.0 7.0 7.0 8.0 10.0
通用 Windows 平台 10.0 10.0 10.0 10.0 10.0 10.0.16299 10.0.16299 10.0.16299 待定
统一 2018.1 2018.1 2018.1 2018.1 2018.1 2018.1 2018.1 2018.1 2021.2
1 为 .NET Framework 列出的版本适用于 .NET Core 2.0 SDK 和更高版本的工具。旧版本对 .NET Standard 1.5 及更高版本使用不同的映射。如果您无法升级到 Visual Studio 2017 或更高版本,您可以下载适用于 Visual Studio 2015 的 .NET Core 工具。
2 此处列出的版本代表 NuGet 用于确定给定 .NET Standard 库是否适用的规则。虽然 NuGet 认为 .NET Framework 4.6.1 支持 .NET Standard 1.5 到 2.0,但在使用为 .NET Framework 4.6.1 项目中的那些版本构建的 .NET Standard 库时存在几个问题。对于需要使用此类库的 .NET Framework 项目,我们建议您将项目升级到 .NET Framework 4.7.2 或更高版本。
3 .NET Framework 不支持 .NET Standard 2.1。有关更多信息,请参阅.NET Standard 2.1的公告。
列代表 .NET Standard 版本。每个标题单元格都是一个指向文档的链接,该文档显示在该版本的 .NET Standard 中添加了哪些 API。
行代表不同的 .NET 实现。
每个单元格中的版本号表示您需要的最低实现版本,以便以该 .NET Standard 版本为目标。
有关交互式表,请参阅.NET Standard 版本。
要查找您可以定位的最高版本的 .NET Standard,请执行以下步骤:
找到指示要运行的 .NET 实现的行。
在该行中从右到左查找指示您的版本的列。
列标题指示目标支持的 .NET Standard 版本。您还可以针对任何较低的 .NET Standard 版本。更高的 .NET Standard 版本也将支持您的实施。
对您要定位的每个平台重复此过程。如果您有多个目标平台,则应选择其中较小的版本。例如,如果您想在 .NET Framework 4.8 和 .NET 5 上运行,您可以使用的最高 .NET Standard 版本是 .NET Standard 2.0。
以哪个 .NET Standard 版本为目标
我们建议您以 .NET Standard 2.0 为目标,除非您需要支持早期版本。大多数通用库不需要 .NET Standard 2.0 之外的 API。.NET Standard 2.0 受所有现代平台的支持,并且是支持一个目标的多个平台的推荐方式。
如果您需要支持 .NET Standard 1.x,我们建议您也以 .NET Standard 2.0 为目标。.NET Standard 1.x 作为 NuGet 包的粒度集分发,这会创建一个大型包依赖关系图,并导致开发人员在构建时下载大量包。有关详细信息,请参阅本文后面的跨平台目标和.NET 5+ 和 .NET Standard。
.NET Standard 版本控制规则
有两个主要的版本控制规则:
附加:.NET Standard 版本在逻辑上是同心圆:更高版本包含以前版本的所有 API。版本之间没有重大变化。
不可变:一旦发布,.NET Standard 版本就会被冻结。
2.1 之后将不再有新的 .NET Standard 版本。有关详细信息,请参阅本文后面的.NET 5+ 和 .NET Standard。
规格
.NET Standard 规范是一组标准化的 API。该规范由 .NET 实施者维护,特别是 Microsoft(包括 .NET Framework、.NET Core 和 Mono)和 Unity。
官方文物
官方规范是一组.cs文件,用于定义作为标准一部分的 API。该参考目录中DOTNET /标准库定义了.NET标准的API。
所述NETStandard.Library元数据包(源)描述了组定义(部分)的一个或多个标准的.NET版本库。
给定的组件,如System.Runtime,描述:
.NET Standard 的一部分(只是它的范围)。
.NET Standard 的多个版本,适用于该范围。
提供衍生工件以实现更方便的阅读并启用某些开发人员场景(例如,使用编译器)。
Markdown 中的 API 列表。
引用程序集,作为 NuGet 包分发并由NETStandard.Library元包引用。
包表示
.NET Standard 参考程序集的主要分发工具是 NuGet 包。实现以多种方式交付,适用于每个 .NET 实现。
NuGet 包针对一个或多个框架。.NET Standard 包面向“.NET Standard”框架。您可以使用netstandard 紧凑型 TFM(例如netstandard1.4)来定位 .NET Standard 框架。旨在在 .NET 的多个实现上运行的库应该以此框架为目标。对于最广泛的 API 集,目标是netstandard2.0因为可用 API 的数量在 .NET Standard 1.6 和 2.0 之间增加了一倍多。
该NETStandard.Library元数据包引用了一套完整的定义.NET标准的NuGet包。最常见的定位方式netstandard是引用这个元包。它描述并提供了对约 40 个 .NET 库和定义 .NET Standard 的相关 API 的访问。您可以引用netstandard旨在访问其他 API 的其他包。
版本控制
该规范不是单一的,而是一组线性版本的 API。该标准的第一个版本建立了一组基线 API。后续版本增加API,继承之前版本定义的API。没有从标准中删除 API 的既定规定。
.NET Standard 并不特定于任何一个 .NET 实现,也不匹配任何这些实现的版本控制方案。
如前所述,2.1 之后将不再有新的 .NET Standard 版本。
目标 .NET 标准
您可以结合使用框架和元包来构建 .NET 标准库。netstandardNETStandard.Library
.NET Framework 兼容模式
从 .NET Standard 2.0 开始,引入了 .NET Framework 兼容模式。这种兼容模式允许 .NET Standard 项目引用 .NET Framework 库,就像它们是为 .NET Standard 编译的一样。引用 .NET Framework 库不适用于所有项目,例如使用 Windows Presentation Foundation (WPF) API 的库。
有关详细信息,请参阅.NET Framework 兼容模式。
.NET 标准库和 Visual Studio
为了在 Visual Studio 中构建 .NET Standard 库,请确保在 Windows 上安装了Visual Studio 2022、Visual Studio 2019或 Visual Studio 2017 版本 15.3 或更高版本,或者在 macOS 上安装了Visual Studio for Mac 版本 7.1或更高版本。
如果您只需要在项目中使用 .NET Standard 2.0 库,您也可以在 Visual Studio 2015 中执行此操作。但是,您需要安装 NuGet 客户端 3.6 或更高版本。可以从NuGet 下载页面下载适用于 Visual Studio 2015 的 NuGet 客户端。
.NET 5+ 和 .NET 标准
.NET 5 和 .NET 6 是具有一组统一功能和 API 的单一产品,可用于 Windows 桌面应用程序和跨平台控制台应用程序、云服务和网站。.NET 5 TFM反映了以下广泛的场景:
net5.0
此 TFM 适用于到处运行的代码。除了少数例外,它只包括跨平台工作的技术。对于 .NET 5 代码,net5.0替换netcoreapp和netstandardTFM。
net5.0-windows
这是一个特定于操作系统的 TFM的示例,它将特定于操作系统的功能添加到net5.0所指的所有内容中。
何时定位 net5.0 或 net6.0 与 netstandard
对于针对 的现有代码,netstandard无需将 TFM 更改为net5.0或net6.0。.NET 5 和 .NET 6 实现 .NET Standard 2.1 及更早版本。从 .NET Standard 重新定位到 .NET 5+ 的唯一原因是可以访问更多运行时功能、语言功能或 API。例如,为了使用 C# 9,您需要面向 .NET 5 或更高版本。您可以多目标 .NET 5 或 .NET 6 和 .NET Standard 以访问更新的功能,并且您的库仍可用于其他 .NET 实现。
以下是 .NET 5+ 新代码的一些准则:
应用组件
如果您使用的库打破一个应用分成几部分组成,我们建议你的目标net5.0或net6.0。为简单起见,最好将构成您的应用程序的所有项目保留在相同版本的 .NET 上。然后你可以假设到处都有相同的 BCL 功能。
可重用库
如果你正在构建计划在 NuGet 上发布的可重用库,请考虑在覆盖范围和可用功能集之间进行权衡。.NET Standard 2.0 是 .NET Framework 支持的最新版本,因此它提供了相当大的功能集。我们不建议以 .NET Standard 1.x 为目标,因为您会限制可用功能集以最小限度地增加覆盖范围。
如果您不需要支持 .NET Framework,则可以使用 .NET Standard 2.1 或 .NET 5/6。我们建议您跳过 .NET Standard 2.1 并直接转到 .NET 6。最广泛使用的库将针对 .NET Standard 2.0 和 .NET 5+ 进行多目标。支持 .NET Standard 2.0 可为您提供最大范围,同时支持 .NET 5+ 可确保您可以为已经使用 .NET 5+ 的客户利用最新的平台功能。
.NET 标准问题
以下是 .NET Standard 的一些问题,有助于解释为什么 .NET 5 及更高版本是跨平台和工作负载共享代码的更好方式:
添加新 API 的缓慢
.NET Standard 是作为所有 .NET 实现都必须支持的 API 集而创建的,因此对添加新 API 的提案进行了审核。目标是仅标准化可以在所有当前和未来 .NET 平台中实现的 API。结果是,如果某个功能错过了某个特定版本,您可能需要等待几年才能将其添加到标准版本中。然后,您需要等待更长时间才能获得新版本的 .NET Standard 的广泛支持。
.NET 5+ 中的解决方案:当一个功能被实现时,它已经可用于每个 .NET 5+ 应用程序和库,因为代码库是共享的。由于 API 规范与其实现之间没有区别,因此您可以比使用 .NET Standard 更快地利用新功能。
复杂的版本控制
API 规范与其实现的分离导致 API 规范版本和实现版本之间的复杂映射。这种复杂性在本文前面显示的表格以及如何解释它的说明中很明显。
.NET 5+ 中的解决方案: .NET 5+ API 规范与其实现之间没有分离。结果是一个简化的 TFM 方案。所有工作负载都有一个 TFM 前缀:net5.0或net6.0用于库、控制台应用程序和 Web 应用程序。唯一的变体是为特定平台指定特定于平台的 API的后缀,例如net5.0-windows或net6.0-windows。多亏了这个 TFM 命名约定,您可以轻松判断给定的应用程序是否可以使用给定的库。不需要像 .NET Standard 那样的版本号等效表。
运行时平台不支持的异常
.NET Standard 公开特定于平台的 API。您的代码可能会编译而不会出错,并且看起来可以移植到任何平台,即使它不是可移植的。当它在没有给定 API 实现的平台上运行时,您会遇到运行时错误。
.NET 5+ 中的解决方案: .NET 5+ SDK 包括默认启用的代码分析器。平台兼容性分析器检测到您打算运行的平台不支持的 API 的无意使用。有关详细信息,请参阅平台兼容性分析器。
.NET Standard 未弃用
可以由多个 .NET 实现使用的库仍然需要 .NET Standard。我们建议您在以下情况下以 .NET Standard 为目标:
用于netstandard2.0在 .NET Framework 和 .NET 的所有其他实现之间共享代码。
用于netstandard2.1在 Mono、Xamarin 和 .NET Core 3.x 之间共享代码。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。