微软2014年开源.NET的动作是实现一个全新的.NET Core ,从而引入了一个新的问题:选择代码的编译目标变得困难,需要面对3个环境。因此微软为了解决这个问题,引入了两个主要的概念:目标框架别名(Target Framework Moniker)和.Net Standard。
目标框架别名(Target Framework Moniker)是.NET Core 中应用程序所针对的框架类型 + 版本号的 ID。我们可以把别名分成两个不同的类型:跨平台的目标:.Net Standard 和平台实现,如.Net Framework、.Net Core 和 Xamarin.
.Net Standard 库是.Net Core 可移植性的核心。其目的是定义标准的 API 集。这些 API,如集合、线程、反射,是由.Net Core、.Net Framework、Xamarin 和 Mono 等平台实现的。它们是开发人员用来构建自己的库和应用程序的基本构建块。
随着.NET 5的完成,微软通过5年时间把代码的编译目标的选择困难问题解决了,而且变得更加简单,因此微软 .NET 官方博客近日发布了一篇谈论 .NET Standard 未来的文章。文章作者是 .NET 项目经理 Immo,他在文章中指出未来 .NET Standard 将会被 .NET 5 取代,还对 .NET 5 如何改进代码共享以及取代 .NET Standard 这个说法进行了解释,此外还介绍了仍然需要 .NET Standard 的情况。
Immo 表示不会再为 .NET Standard 发布新版本,但 .NET 5 及其所有未来的版本将继续支持 .NET Standard 2.1 和更早版本。他建议开发者可以考虑将net5.0
(以及未来的版本)作为共享代码的基础,甚至可以将 .NET 5 视为 .NET Standard vNext。
因为 .NET 5 将会是具有统一功能和 API 的单一产品,可用于开发 Windows 桌面应用程序、跨平台移动应用程序、控制台应用程序,以及云端服务和网站。而且为了更好地体现 .NET 5 的定位,微软还更新了目标框架名称(TFM, Target Framework Name)。
.NET Standard 的出现是为了提供 .NET 统一跨平台的基础函数库,方便开发者编写在任何平台执行的函数库,但 Immo 指出了 .NET Standard 存在 3 个问题,包括版本更新缓慢、.NET Standard 版本与 .NET 实现的映射较为复杂以及 .NET Standard 包含了特定于平台的功能,因此无法静态验证代码是否真正可移植。
.NET 5 针对这些问题均提供了解决方案,而且 .NET 5 和未来的版本将会支持 .NET Standard 2.1 以及更早版本,因此开发者可以不需要更新现有程序,不过如果开发者希望使用额外的 Runtime 功能、语言功能以及 API,可以选择将 .NET Standard 升级使用 .NET 5。
对于新项目应该从 .NET Standard 2.0 开始还是直接使用 .NET 5 的问题,Immo 认为主要取决于应用程序组件和可重用的库。
当开发者使用函数库将应用程序分解成多个组件,为简单起见,组成应用程序的所有项目最好都位于同一版本的 .NET 上,此时可以考虑 .NET 5。
如果要构建计划在 NuGet 上使用的可重用库,则需要考虑可用的功能集:.NET Standard 2.0 是 .NET Framework 支持 .NET Standard 的最高版本,其提供了庞大的功能集,覆盖范围广。
总结:
用于在 .NET Framework 和所有其他平台之间共享代码,使用
netstandard2.0
用于在 Mono,Xamarin 和 .NET Core 3.x 之间共享代码,使用
netstandard2.1
向后共享代码,使用
net5.0