.NET Core 、 .NET 5、.NET 6和.NET 7 简介及区别

发布时间 2023-11-07 00:00:42作者: 凯帝农垦

.NET是一种用于构建多种应用的免费开源开发平台,可以使用多种语言,编辑器和库开发Web应用、Web API和微服务、云中的无服务器函数、云原生应用、移动应用、桌面应用、Windows WPF、Windows窗体、通用 Windows平台 (UWP)、游戏、物联网 (IoT)、机器学习、控制台应用、Windows服务。框架主要包括:.NET Framework、.NET Standard、.NET Core与.NET 5/6/7 。本主要介绍一下.NET Core 、 .NET 5、.NET 6和.NET 7简介及区别。

1、类库(.NET Standard)和类库(.NET Core)区别

相关文档:https://docs.microsoft.com/en-us/dotnet/core/packages#package-based-frameworks

1) 兼容性

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

2) API表面积(API Surface Area)

NETStandard.Library 提供了.NET Standard中的所有东西。而.NET Core libraries则包含了Microsoft.NETCore.App中的所有内容。后者包括大约20个其他库,我们可以将其中一些手动添加到我们的.NET Standard库中(例如,System.Threading.Thread),而其中一些与.NET Standard不兼容(例如,Microsoft.NETCore.CoreCLR)。

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

2、类库(.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不兼容。

3、类库(.NET Standard)和类库(.NET Core)同时存在的原因

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

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

4、.NET Standard 和 .NET Platforms关系

通过代码接口之间继承说明它们之间的关系

using System;
namespace Analogy
{
//每个接口表示一个目标框架,方法表示该目标框架上可用的api组。
//目的是展示.NET Standard API surface和其他.NET platforms之间的关系

    // .NET Standard
    interface INetStandard10
    {
        void Primitives();
        void Reflection();
        void Tasks();
        void Collections();
        void Linq();
    }
    interface INetStandard11 : INetStandard10
    {
        void ConcurrentCollections();
        void InteropServices();
    }
    interface INetStandard12 : INetStandard11
    {
        void ThreadingTimer();
    }
    interface INetStandard13 : INetStandard12
    {
        void FileSystem();
        void Console();
        void ThreadPool();
        void Process();
        void Sockets();
        void AsyncLocal();
    }
    interface INetStandard14 : INetStandard13
    {
        void IsolatedStorage();
    }
    interface INetStandard15 : INetStandard14
    {
        void AssemblyLoadContext();
    }
    // .NET Framework 
    interface INetFramework45 : INetStandard11
    {
        void FileSystem();
        void Console();
        void ThreadPool();
        void Crypto();
        void WebSockets();
        void Process();
        void Sockets();
        void AppDomain();
        void Xml();
        void Drawing();
        void SystemWeb();
        void WPF();
        void WindowsForms();
        void WCF();
    }
    interface INetFramework451 : INetFramework45, INetStandard12
    {
        // TODO: .NET Framework 4.5.1 specific APIs
    }
    interface INetFramework452 : INetFramework451, INetStandard12
    {
        // TODO: .NET Framework 4.5.2 specific APIs
    }
    interface INetFramework46 : INetFramework452, INetStandard13
    {
        // TODO: .NET Framework 4.6 specific APIs
    }
    interface INetFramework461 : INetFramework46, INetStandard14
    {
        // TODO: .NET Framework 4.6.1 specific APIs
    }
    interface INetFramework462 : INetFramework461, INetStandard15
    {
        // TODO: .NET Framework 4.6 specific APIs
    }
    // Mono
    interface IMono43 : INetFramework46
    {
        void MonoSpecificApi();
    }
    // Windows Universal Platform
    interface IWindowsUniversalPlatform : INetStandard14
    {
        void GPS();
        void Xaml();
    }
    // Xamarin 
    interface IXamarinIOS : INetStandard15
    {
        void AppleAPIs();
    }
    interface IXamarinAndroid : INetStandard15
    {
        void GoogleAPIs();
    }
    // .NET Core
    interface INetCoreApp10 : INetStandard15
    {
    }
    // 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
    }
}

 

1、.NET Core

.NET Core是适用于 Windows、Linux 和 macOS 的免费、开源托管的计算机软件框架,是微软开发的第一个官方版本,具有跨平台能力的应用程序开发框架 (Application Framework)。

.NET Core 是由许多项目所组成,除了基本的类库(Core FX) 之外,也包含采用 RyuJIT 编译的运行平台 Core CLR、编译器平台.NET Compiler Platform、采用 AOT 编译技术运行最优化的包 Core RT (.NET Core Runtime),以及跨平台的 MSIL 编译器 LLILC (LLVM-based MSIL Compiler) 等项目。NET Core 3.1是一个长期支持(LTS)版本,将支持三年。

NET Core 3.1支持的平台:

  • Alpine: 3.10+
  • Debian: 9+
  • Ubuntu: 16.04+
  • Fedora: 29+
  • centOS: 7+
  • RHEL: 6+
  • openSUSE: 15+
  • SUSE Enterprise Linux (SLES): 12 SP2+
  • macOS: 10.13+
  • Windows Client: 7, 8.1, 10 (1607+)
  • Windows Server: 2012 R2+

注意:Windows窗体和WPF应用程序仅在Windows上运行和支持。

CPU架构支持:

  • x64 支持 Windows, macOS, 和 Linux
  • x86 支持 Windows
  • ARM32 支持 Windows 和 Linux
  • ARM64 支持 Linux (kernel 4.14+)

注意: 需要确保.NET Core 3.1 ARM64部署使用Linux内核4.14版本或更高版本。例如,Ubuntu 18.04满足这个要求,但16.04是不满足的。

参考文档:https://devblogs.microsoft.com/dotnet/announcing-net-core-3-1/

2、.NET 5

.NET 5 是继 3.1 之后 .NET Core 的下一个主要版本。 命名为.NET 5出于以下两个原因:

1)跳过了版本编号 4.x,以避免与 .NET Framework 4.x 混淆。

2)从名称中删除了“Core”,是为了强调这是 .NET 未来的主要实现。 与 .NET Core 或 .NET Framework 相比,.NET 5 会支持类型更多的应用和平台。

ASP.NET Core 5.0 虽以 .NET 5 为基础,但保留了名称“Core”以避免与 ASP.NET MVC 5 混淆。 同理,Entity Framework Core 5.0 保留了名称“Core”,以避免与 Entity Framework 5 和 Entity Framework 6 混淆。

 

.NET 5 不会替换 .NET Framework,.NET 5 及更高版本是 .NET 未来的主要实现,但 .NET Framework 4.x 仍受支持。 目前没有计划将以下技术从 .NET Framework 移植到 .NET 5,但 .NET 中有一些替代项:

 

技术

建议使用的替代项

Web 窗体

ASP.NET Core

Razor

Razor Pages

Windows 工作流 (WF)

Elsa-Workflows

 

.NET 5 不会替代 .NET Standard,新的应用程序开发可为所有项目类型(包括类库)指定 net5.0 目标框架名字对象 (TFM)。 在 .NET 5 工作负载之间共享代码得到了简化,因为你只需要 net5.0 TFM。对于 .NET 5 应用和库,net5.0 TFM 合并和替换了 netcoreapp 和 netstandard TFM。 但是,如果计划在 .NET Framework、.NET Core 和 .NET 5 工作负载之间共享代码,可以通过将 netstandard2.0 指定为 TFM 来实现此目的。

编写 .NET 5 应用的开发人员将有权访问最新的 C# 版本和功能。 .NET 5 与 C# 9 搭配,为语言带来了许多新功能。

 

参考文档:https://learn.microsoft.com/zh-cn/dotnet/core/whats-new/dotnet-5

3、.NET 6

.NET 6 提供 .NET 统一计划的最终部分,该计划在 .NET 5 中启动。 .NET 6 在移动、桌面、IoT 和云应用之间统一了 SDK、基础库和运行时。 除了这方面的统一以外,.NET 6 生态系统还提供了以下功能:

1)简化开发

轻松入门。 C# 10 中的新语言功能可减少需要编写的代码量。 利用 Web 堆栈和最小 API 的投资,可以轻松地快速编写更小、更快速的微服务。

2)更佳的性能

.NET 6 是最快的完整堆栈 Web 框架,如果在云中运行,则会降低计算成本。

3)终极工作效率

.Net 6 和 Visual Studio 2022 提供热重载、新的 git 工具、智能代码编辑、可靠的诊断和测试工具以及更好的团队协作。

.NET 6 将作为长期支持 (LTS) 版本得到三年的支持。 .NET 6 重写 System.IO.FileStream 类型,以便在 Windows 上提供更佳的性能和可靠性。 现在 FileStream 绝不会在为 Windows 上的异步 I/O 创建时阻止。按配置优化 (PGO) 是指 JIT 编译器根据最常使用的类型和代码路径生成优化后的代码。 .NET 6 引入了动态 PGO。 动态 PGO 与分层编译配合运作,以根据层级 0 中实施的其他检测来进一步优化代码。 动态 PGO 默认情况下处于禁用状态,但可以使用 DOTNET_TieredPGO环境变量来启用它。

 

.NET 6 引入了 Crossgen2,它是已被删除的 Crossgen 的后继版本。 Crossgen 和 Crossgen2 是用于提供预先 (AOT) 编译的工具,可改进应用的启动时间。 Crossgen2 是用 C# (而不是 C++)编写的,可执行之前的版本无法实现的分析和优化。

.NET 6 版本支持 macOS Arm64(或“Apple Silicon”)和 Windows Arm64 操作系统,支持本机 Arm64 执行和 x64 模拟。 此外,x64 和 Arm64 .NET 安装程序现在会并行安装。

使用热重载功能,可以修改应用源代码,并立即将这些更改应用到正在运行的应用。 此功能的目的是避免在编辑之间重新启动应用程序,从而提高工作效率。 热重载在 Visual Studio 2022 和 dotnet watch 命令行工具中可用。 热重载适用于大多数类型的 .NET 应用以及 C#、Visual Basic 和 C++ 源代码。

参考文档:https://learn.microsoft.com/zh-cn/dotnet/core/whats-new/dotnet-6

4、.NET 7

.NET 7 为应用程序带来了更高的性能和C# 11/ F# 7、.NET MAUI、ASP.NET Core/Blazor, Web api, WinForms, WPF等等。有了.NET 7\还可以轻松地将.NET 7项目进行容器化,在GitHub操作中设置CI/CD工作流,并实现云原生的可观察性。

.NET仍然是最快、最受喜爱和信任的平台之一,它拥有庞大的.NET包生态系统,包括超过33万个包。

.NET 7版本与其他产品、库和平台一起发布,包括:

更新与优化包括如下:

1).NET MAUI

.NET多平台应用程序 UI (MAUI) 将 Android、iOS、macOS 和 Windows API 统一到一个API中,开发者可以编写一个在多平台上本机运行的应用。作为.NET 7的一部分,.NET MAUI提供了一个项目来处理跨设备及其平台的多目标。

2)ARM64

ET可帮助开发者构建在ARM设备上运行的应用,.NET 7将迎来多项改进。

3)性能

.NET 7是目前最快的.NET。.NET 7对反射、堆栈替换 (OSR)、启动时间、本机 AOT、循环优化和许多其他领域进行了超过一千项影响性能的改进。

5、.NET Framework、.NET Standard、.NET Core与.NET 5/6/7 区别

.NET Framework框架只能在windows上运行,但各种跨平台的需求原来越强烈,不能满足跨平台、模块化的需求。微软把.NET Framework可以跨平台的部分提取出来,封装成标准库就是.NET Standard。无论哪个系统平台上,标准库里内容是完全通用的。但其他系统的特有的部分在Windows中也没有,所以在标准库.NET Standard基上开发出来.NET Core。.NET Core稳定后,改名成.NET 5/6/7。

1).NET Core

适用于windows、linux、macos操作系统的免费开源托管的计算软件框架。最初是为了支持ASP.NET Core而创建的。.NET Core可以在Windows、Linux和macOS上运行,并且支持多种编程语言,如C#、F#和Visual Basic。

2).NET Standard

基础的规范标准,把.NET Framework的某些程序集对应到.NET Core。如果本来就是.NET Core以上的版本就没必要使用.NET Standard。

3).NET 5/6/7

.NET Core的稳定版本 官方也有文档说明如何 从 ASP.NET Core 3.1 迁移到 6.0。

.NET 5是.NET Core的下一个版本,它是一个统一的开发平台,用于构建应用程序和服务,可以在Windows、Linux和macOS上运行。.NET 5支持多种编程语言,包括C#、F#、Visual Basic和C++/CLI。

.NET 6是.NET 5的后续版本,它将在2021年发布。.NET 6将包括更多的功能和改进,如更好的性能、更好的可靠性、更好的安全性和更好的开发人员体验。

.NET 7是.NET 6的后续版本,它将包括更多的功能和改进,以进一步提高性能、可靠性、安全性和开发人员体验。