跨平台应用程序开发框架-.NET Core
2023-10-12 14:21:38 阿炯

.NET (3.1版以前称作.NET Core)是微软开发的第一个跨平台 (Windows、Mac OSX、Linux)的应用程序开发框架(Application Framework),未来也将会支持FreeBSD与Alpine平台。.Net Core也是微软在一开始发展时就开源的软件平台,它经常也会拿来和现有的开源 .NET 平台Mono比较。采用C++与C#语言实现并在MIT许可证协议下授权使用。


由于 .NET Core 的开发目标是跨平台的 .NET 平台,因此 .NET Core 会包含 .NET Framework 的类别库,但与 .NET Framework 不同的是其采用包化 (Packages) 的管理方式,应用程序只需要获取需要的组件即可,与 .NET Framework 大包式安装的作法截然不同,同时各包亦有独立的版本线 (Version line),不再硬性要求应用程序跟随主线版本;微软家的产品最大的特点:乱。由.NET基金会开发与维护。

.NET Core 的主要目标有:
支持或可以移转 (port) 到更多的操作系统平台与芯片架构 (也就是未来项目会跨出 x86 平台)。
具有引人注目的性能与高可靠度。
开发人员能快速与直觉的获取 .NET Core 开发环境。
在直觉与具生产力的情况下建造应用程序,使用文件,示例与 NuGet 组件。
    
.NET Core 1.0 于 2016 年 6 月 27 日发布。
2020 年 11 月,微软发布了 .NET 5.0,统一了.NET的各个平台的碎片版本:.NET Framework 4.8, .NET Standard, .NET Core 3.1, Mono, Xamarin等。
2021 年 11 月,微软发布了 .NET 6.0。
2022 年 11 月,微软发布了 .NET 7.0。


.NET Standard

托管框架的每一种实现都有一套自己的基类库。基类库(BCL)包含诸如异常处理、字符串、XML、I/O、网络和集合这样的类。.NET Standard是一项实现BCL的规范。由于.NET实现需要遵循这项规范,所以应用程序开发人员就不用担心每一种托管框架实现的BCL不同。

框架类库(FCL),如WPF、WCF、ASP.NET,不包含在BCL中,因此,也就不包含在.NET Standard中。其与.NET实现之间的关系就和HTML规范与浏览器之间的关系一样。后者是前者的实现。因此.NET Framework、Xamarin和.NET Core,每一种托管框架都实现了.NET Standard中的BCL。随着计算机工业不断推出新的硬件和操作系统,将来还会出现新的.NET托管框架。该标准让应用程序开发人员知道,他们可以依赖于一套始终如一的API。

每个.NET版本都对应一个.NET Standard版本。Standard是.NET API的一个规范,它为每个.NET运行时提供了实现。API一致,将应用程序移植到不同的托管实现以及提供工具都会更简单。.NET Standard被定义为一个单独的NuGet包,因为所有的.NET实现都必须支持它。工具变得简单了,因为对于特定的版本,它们有一套相同的API。可以针对多个.NET实现构建一个库项目,还可以构建特定平台API的.NET Standard封装器。

.NET Framework,.NET Core和Mono是Runtime,它们还包含用于构建应用程序的库和框架。为了满足现代应用的需求,.Net生态系统正在经历不断的升级改造,下图是.Net生态系统的现状:


.NET Standard Library 是一组API规范,它不是用户下载和安装的东西,而是描述API和API做什么的规范。基础设施是指让上面所有的东西可以工作,它包含编译器,语言和运行时组件,如垃圾回收器和即时编译。


核心功能

.NET Core 是由许多项目所组成,除了基本的类别库 (Core FX) 之外,也包含采用 RyuJIT 编译的执行平台 Core CLR、编译器平台 .NET Compiler Platform、采用 AOT 编译技术运行优化的包 Core RT (.NET Core Runtime),以及跨平台的 MSIL 编译器 LLILC (LLVM-based MSIL Compiler) 等项目。

同时,微软也发展了一个建置技术文件的平台 docfx [17],并运用于 .NET Core 的文件网站。

RyuJIT
是微软发展的新式即地编译器 (Just-in-Time Compiler),用以取代现有的 .NET Framework 的 JIT 以及 JIT64 即地编译器,依据微软公布的测试报告,RyuJIT 的性能较前一代的 JIT 提升约 25%,并支持 SIMD (Single Instruction, Multiple Data) 的技术。RyuJIT 同时应用于 .NET Framework 4.6 以及 .NET Core[18]。

Core CLR
移植 .NET Framework 的 CLR 的功能,包含核心程序库 mscorlib、JIT 编译器、垃圾收集器 (GC) 以及其他执行 MSIL 所需要的执行期环境。

Core RT
是以预先编译为主的核心功能,在 .NET Core 内称为 Core RT,在 UWP 则是称为 .NET Native。Core RT 会在建造时期 (非执行期) 在编译时将 MSIL 转换成平台本地的机器代码,以获取较短的启动时间 (JIT 采用的是执行时期编译,使得启动时间拉长),以及存储器用量减少的优点。Core RT 会在不同的平台使用不同的 AOT 技术:Windows 上使用的是 .NET Native。Mac OS 与 Linux 上使用的是 LLILC (同时支持 JIT 和 AOT)。

LLILC
(LLVM-based MSIL Compiler,英文发音为 "lilac") 是 .NET Core 在非 Windows 平台的 MSIL 编译器[19],基于 ECMA-335 (Common Language Infrastructure) 的标准将 MSIL 编译成原生码执行,适用于可运行 LLVM 的操作系统,例如 Mac OSX 与 Linux 操作系统。同时支持 JIT (内含 RyuJIT 的实现) 以及 AOT (未来将开始支持) 的编译方式。

Roslyn
.NET Compiler Platform (项目代码为 Roslyn) 是将 .NET 平台的编译架构标准化的平台,它可提供程序管理工具 (如集成开发环境) 相当多的情报,用以发展有助于编写程序与管理程序结构所需要的功能,例如类型信息、语法结构、参考链接、语义、编译器、自动化、错误回报等等功能,只要是遵循 CLI 标准的编程语言,都可以利用其实现出编译器,让程序管理工具能实现如语法提示、语法自动完成、关键字高亮等可视化能力。可同时支持 .NET Framework 4.6 以上版本,.NET Core 也原生支持。


.NET Core 基于跨平台能力,并没有将与 GUI 高度相关的 API 移植到 .NET Core 内,因此像是 Windows Forms 或是 Windows Presentation Foundation (WPF) 并未移植到 .NET Core。.NET Core 支持控制台应用程序 (Console Application) 以及类别库 (Class Library) 类型的项目。不过微软在其 Universal Windows Platform (UWP) 开发平台使用了 .NET Core,并且利用 .NET Native 技术将其性能提升至十分接近原生码的速度。ASP.NET Core 则以控制台应用程序驱动其托管环境 Kestrel Server 以支持 ASP.NET Core 程序的执行。于2016年正式推出。

从技术上讲,.NET Core仅支持控制台应用程序。ASP.NET Core和UWP是以.NET Core为基础构建的应用程序模型。与.NET Framework不同,.NET Core没有作为Windows组件考虑。因此更新是以NutGet包的形式,而不是通过Windows Update。由于.NET Core运行时安装成了App-Local,而应用程序升级是通过包管理器完成的,所以应用程序可以关联特定的.NET Core版本以及单独升级。

.NET Core 经常会拿来与其他平台做模拟,尤其是它的源头 .NET Framework 以及另一个相似性质的开源平台 Mono。优势如下:
1. 跨平台。.net core可以在Windows,Linux,macOS平台上运行。跨平台这一点一直是.net Framework的短板,也正是因为不能跨平台,被Java等其他各自语言抢占了市场。
2. 代码开源。.net core的代码是开放源代码的。
3. 更卓越的性能。.net core在.net 的基础上进行了性能的优化,在各方面的测试中都表现出了比.net更加优越的性能。


.NET Framework
据微软的帮助,.NET Core 和 .NET Framework 是子集 (Subset) 与超集 (Superset) 的关系,.NET Core 将会实现出部分的 .NET Framework 功能 (基本上是不含用户界面的部分),例如 JIT (.NET Core 采用 RyuJIT)、垃圾收集器 (GC) 以及类型 (包含基本类型以及泛型类型等)。未来两者也将会是各自发展,但它们也会同时使用彼此的功能,例如 .NET Compiler Platform 与 RyuJIT 等技术。.NET Framework自2002年诞生以来,表现一直很抢眼,用户可以使用它来构建WPF、Windows窗体、ASP.NET窗体和MVC应用程序;还可以构建多种类型的应用程序,但主要以Windows为中心的。这是这是因为它为某些应用程序类型使用了某些特定于Windows的API。

.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。2020年3月,微软发布了.NET 5的第一个预览版,并在同年的11月发布了.NET 5的第一个正式版。


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

Mono
Mono 是另一个已发展许久的 .NET Framework 跨平台开源版本,基本上并不隶属微软官方,而是由社群的力量所主导,自成一个生态系统,也开发出了像Xamarin这样的跨平台.NET移动应用,.NET Core 与 Mono 未来会是合作的关系,Mono 仍会维持社群力量的维护与发展,而 .NET Core 则会以官方角度来进行发展,两边也会一起进行彼此功能上的增进。

用一套代码开发基于Xamarin的支持多端(Windows,Android,iOS)的应用程序;
可以开发基于Blazor的桌面应用;
跨平台的网站应用,Web API应用,微服务;
跨平台的游戏开发Unity,目前应用得非常广泛,像【王者荣耀】这类大型的手游都是使用Unity开发出来的;
基于WPF的桌面应用程序,使用WPF你可以自定义完成超酷的用户交互界面;
物联网、人工智能、机器学习一个不漏。