说点胡扯的话
从16年毕业到今天(2024-8)8年时间,做过Win Forms, Web Form, MVC, WEB API。现在回顾起来,平时工作中只关注自己用到的很小的一部分,对.NET一直没有一个清晰的认知、一个完整的概念,确实很羞愧万分。所以这篇就先对.NET做一个浅浅Overview吧。我这里只做一个点到为止的阐述,如果大家想深入了解这里提到的每种框架和技术请自行搜索一下。如果文章中有不准确的部分,请告知我修改。
Let's Start!
.NET 的发展时间线在此就不再阐述了,网上一搜一大堆。只讲.NET 发展过程中出现的主要框架。
先做一个总览吧,作为一个.Neter 肯定都听说过这些东西:
- .NET Framework
- .NET Standard
- .NET(在这里.NET5 及之后的版本我统称为.NET)
- .NET Core
- Mono
- Xamarin
- MAUI
- C#、F#、Visual Basic(VB)
.NET Standard
.NET Standard 是一个.NET API规范,起到限制约束的作用,所以我更喜欢把它比作 接口。就像每个类必须实现它继承的接口,所以每种.NET实现都需要实现这个标准的接口。
那么什么是.NET 实现呢?就是这些东西:
- .NET Framework
- .NET(在这里.NET5 及之后的版本我统称为.NET)
- .NET Core
- Mono
.NET Standard有很多个版本,版本越高提供的API数量越多,所以每种实现的每个版本所实现的.NET Standard版本不尽相同,如下图所示,下面是.NET Standard 2.0由以下实现所支持
.NET Standard 2.1由以下实现所支持:
如果我们的类库是基于.NET Standard 2.0编写的,那么任何基于.NET Standard 2.0+ 的实现都可以引用我们编写的这个类库。如果我们要使用.NET Standard 2.0里的API,而我们使用的是.NET Core 1.0版本,那么有一种情况就是我们无法找到这个API,因为我们用的.NET Core 1.0没有实现.NET Standard 2.0里所定义的这个API。
我电脑没有装.NET Standard 2.0之前的版本,就拿.NET Standard 2.1里新增的一种数据类型Index来说吧。
在.NET 6(支持.NET Standard 2.1)里可以正常使用,如下图:
然而在.NET Core 2.1(它只支持.NET Standard 2.0)里根本找不到这个类型,如下图
.NET Standard 2.1之后将不再更新,为什么不再更新了呢?详细可见此文档:The future of .NET Standard。如果你要在各种实现之间共享代码,那么你的类库推荐以.NET Standard 2.0作为目标,因为.NET Standard 2.0被所有实现支持,但你也要根据自身情况选择你所用的实现支持的.NET Standard版本。
最后给大家看一个在.NET Standard中定义的一个类,我们第一次写C#的Hello Word肯定会用到的一个类~。可以看到它里面全是空方法,由各种实现来填充每个方法。
public static partial class Console
{
public static System.ConsoleColor BackgroundColor { get { throw null; } set { } }
public static int BufferHeight { get { throw null; } set { } }
public static int BufferWidth { get { throw null; } set { } }
//... 省略部分代码
public static void WriteLine() { }
public static void WriteLine(bool value) { }
public static void WriteLine(char value) { }
public static void WriteLine(char[] buffer) { }
public static void WriteLine(char[] buffer, int index, int count) { }
public static void WriteLine(decimal value) { }
public static void WriteLine(double value) { }
public static void WriteLine(int value) { }
public static void WriteLine(long value) { }
public static void WriteLine(object value) { }
public static void WriteLine(float value) { }
public static void WriteLine(string value) { }
public static void WriteLine(string format, object arg0) { }
public static void WriteLine(string format, object arg0, object arg1) { }
public static void WriteLine(string format, object arg0, object arg1, object arg2) { }
public static void WriteLine(string format, params object[] arg) { }
}
.NET Framework
.NET Framework 可以说是每种实现的老大哥,它是最早的一个官方实现,之前我们很多的项目都是基于.NET Framework的,比如Win Forms, Web Form, ASP.NET等等。.NET Framework由CLR(Common Language Runtime 公共语言运行时) 和FCL(Framework Class Library)组成。FCL包含了BCL(Base Class Library)和其他微软开发的类库。
在这里简单提一下:
BCL看名字就知道是基础类库,比如我们最常用的System.Console、System.IO.File、System.Text.StringBuilder都是基础类库里的东西。
而FCL翻译过来就是框架类库,它包含了BCL的同时又新加了一些微软开发的类库,用于开发Win Form,Web Form,Web MVC等,比如下面提到的这些都是FCL里提供的:
- 开发ASP.NET MVC用到的 System.Web.Mvc.Controller(我们的Controller都继承于它);
- 开发ASP.NET Web Form 用于向页面传值的 System.Web.UI.StateBag;
- 开发ASP.NET Web API用到的过滤器 System.Web.Http.Filters.ActionFilterAttribute;
.NET Core
.NET Core 也是一个官方实现。它主要由Core CLR(Common Language Runtime 公共语言运行时)、Core RT、Core FX、ASP.NET Core Runtime、.NET Desktop Runtime等组成。Core CLR 和 Core RT 是两个运行时,主要区别在于 Core CLR 以即时编译的方式运行代码,Core RT 以预编译的方式运行代码。Core FX 相当于.NET Framework中的BCL,它实现了.NET Standard。ASP.NET Core Runtime包含了运行Web应用所需的全部类库,.NET Desktop Runtime包含运行桌面程序所需的类库。如果只运行控制台程序安装Core CLR就好了,如果要运行Web应用还要安装ASP.NET Core Runtime,要运行桌面程序同理需安装.NET Desktop Runtime。
微软呢终于意识到开源跨平台的重要性,.NET Framework已经无法适应时代发展的需要,微软如果直接把.NET Framework改造成跨平台的,有太多历史羁绊,工作量太大,更不现实,所以.NET Core就诞生了,它的目标就是跨平台。最初.NET Core 只支持开发ASP.NET Core应用,因为Web应用最容易跨平台,微服务是当之无愧的主流应用部署模式。之后经过.NET Core 2.0+、.NET Core 3.0+的发展逐步兼容了其他类型的开发,比如:Win Form、WPF、UWP,但他们只能运行在Windows上,因为他们依赖了Window特有的API,他们是借助于优化的.NET Core CLR带来更好的程序性能。.NET Core可以运行在Windows,Linux,Mac OS。其实在.NET Core之前就有一个实现可以跨平台运行就是Mono,等下面再介绍它。
.NET
.NET 是最新的一个官方实现,我们可以用它开发更多类型的应用:ASP.NET Core、Windows 窗体和 Windows Presentation Foundation (WPF)。.NET把.NET Framework 和 .NET Core 进行了统一,以后只有这一条主线进行发展,.NET 5及之后的各个版本将会取代.NET Standard、.NET Framework、.NET Core。但是.NET Framework还是会继续支持很多年,因为有些功能将不会移植到.NET,比如Web Form、WF(Windows Workflow)。而.NET Core已经完成它的历史使命,将退出历史舞台,你还是可以继续使用.NET Core,但是放着更强大的.NET 不用不是想不开嘛~ .NET 5 及之后的每个版本提供一个一致的(uniform)API, 同时每种不同的操作系统又提供了(OS-specific)特定于操作系统的API,比如。前面提到的.NET Standard停止更新的结果就是这样的。因.NET Standard更新速度太慢,无法跟上.NET的发展速度,现在.NET每年会有一个版本,每单数年份会有一个LST版本。
Mono
早在.NET Core出来之前,Mono就作为跨平台的.NET实现运行在了Android、Linux、macOS、iOS等系统之上。可以把它当作跨平台的.NET Framework,它提供了Mono运行时,BCL。它通常用来做Unity游戏开发和移动端应用开发。
Xamarin
Xamarin用来做移动端开发,可以做到一次开发多处运行的能力,它的能力就由Mono提供。参考下图:
MAUI
MAUI 与 Xamarin一样做跨平台应用开发,可以做到一次开发多处运行。MAUI可以做手机端,桌面,平板应用,它是基于Mono和.NET Core CLR提供跨平台能力。对于Android, iOS和macOS,使用Mono运行时,而在Windows系统山使用 .NET CoreCLR运行时。
各个不同的平台使用的BCL是相同的,这样我们在编写程序业务逻辑时写的是一样的代码,只不过上面提到的两种运行时会根据不同的执行环境(Android,IOS,macOS,Window)执行不同的底层代码。
参考下图:
做个总结吧
.NET Standard作为规范定义了.NET Framework、.NET Core、.NET、Mono的公同的实现功能。他们四个是在一个层级的称为框架的东西。而Xamarin、MAUI是建立在上述框架之上的一种应用程序构建方式,Xamarin、MAUI和ASP.NET、Win From、WPF、WCF在同一个层次。这篇文章虽然放在了C#高级编程分类里,但它更适合初级编程需要了解的知识。
Done!
最后再胡扯一点别的东西吧
2023年的程序员
裁员!!!
这就是今年的主题吧,如今已到2023年的年底,实在想跳出当前的环境。之前自认为自己的.net技术已经炉火纯青,现在看来还是太年轻。自己也认识到自己的不足,在网上找了关于C#高级编程的文章看看,找到了一些,但总觉得不是自己的,并没有烂熟于心的关键,不如以一个输出者的身份用自己的话讲述一遍(我一直都认为一个东西能用自己的话讲出来并教会别人,这个东西才能烂熟于心),所以萌生了写一个C#高级编程系列,巩固自己基础的同时也希望能记录下来与大家分享。
2024年的程序员
这篇文章23年12月份开始写的,写了一部分,今年24年又捡起来写。上面裁员这段是最开始的时候写的,没想到过了快一年,2024年对于程序员的主题依然是裁员,笑死... 也没想到高级编程这个系列能拖这么久。。。(因为我就在23年的年底顺利“毕业”了,,哈哈哈哈哈哈。后面这个高级编程系列可能也不一定会持续更新吧,活下去最重要。
参考资料
.NET 发展历史(推荐!非常直观)
The future of .NET Standard
.NET Standard官方文档
.NET Standard源代码
.NET Standard每个版本定义的API,以及各个版本之间的差异
What is Xamarin
What is MAUI