首页 > 其他分享 >一个简单的介绍- .NET Standard、.NET Framework、.NET、.NET Core、Mono、MAUI、Xamarin

一个简单的介绍- .NET Standard、.NET Framework、.NET、.NET Core、Mono、MAUI、Xamarin

时间:2024-08-12 14:07:46浏览次数:8  
标签:Core Xamarin Standard Framework static NET public

说点胡扯的话

从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 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

标签:Core,Xamarin,Standard,Framework,static,NET,public
From: https://www.cnblogs.com/WeepingWeeper/p/17843934.html

相关文章

  • NetCDF 文件批量转栅格并导出栅格各波段
    两年前,我曾发布过一篇名为《导出NetCDF栅格图层的各个波段》的公众号推文,讲述了通过网络中的ArcGIS工具将单个NetCDF文件的各个波段分别导出为tif文件的方法。该工具提供了arcpy源代码,我们以该代码为基础,将其转换为ArcGISPro环境下的Python3代码,并使程序可对多个文......
  • Kubernetes-二进制高可用部署v1.23.x
    目录高可用架构k8s集群组件ectdkube-apiserverkube-schedulerkube-controller-managerkubeletkube-proxykubectl高可用分析负载均衡节点设计1.环境准备1.1环境规划1.2所有节点配置host解析1.3安装必备工具1.4所有节点关闭防火墙、selinux、dnsmasq、swap1.5Master01节点免密......
  • 从零开始:Kubernetes 集群的搭建与配置指南,超详细,保姆级教程
    从零开始搭建Kubernetes集群从零开始搭建Kubernetes(K8s)集群部署方式准备工作(所有节点)1.关闭防火墙2.关闭SELinux3.关闭Swap分区4.设置主机名5.配置网络设置6.安装IPVS(可选,非必须)安装Docker、kubeadm、kubelet和kubectl1.安装Docker2.安装cri-docke......
  • Playwright.Net下载文件 WaitForDownloadAsync
    Playwright.Net下载文件,使用WaitForDownloadAsync Playwright=awaitMicrosoft.Playwright.Playwright.CreateAsync();varuserDataDir=$"{Directory.GetCurrentDirectory()}\\UserData";varcontext=awaitPlaywright.Chromium.LaunchPersist......
  • 高级.NET Core分布式事务相关的面试题
    以下是一些高级.NETCore分布式事务相关的面试题,这些问题涵盖了概念、实际应用以及最佳实践,可以帮助评估候选人在分布式事务方面的理解和实际操作能力。1.分布式事务的基本概念与.NETCore支持什么是分布式事务?它与本地事务有何不同?.NETCore中有哪些常用的分布式事务解决方......
  • 关于异步编程和多线程的高级.NET Core面试题
    以下是一些关于异步编程和多线程的高级.NETCore面试题。这些问题涵盖了从基础概念到复杂应用的各个方面,可以帮助评估候选人在异步编程和多线程开发方面的能力。1.异步编程基础在.NETCore中,异步编程的基本原理是什么?async和await关键字的作用是什么?如何在.NETCore中使用......
  • .NET 8 跨平台高性能边缘采集网关
    前言在物联网(IoT)和工业自动化领域,边缘计算设备扮演着至关重要的角色。边缘采集网关作为连接物理世界与数字世界的桥梁,负责收集传感器数据并将数据传输到云端或本地数据中心进行处理。本文将介绍一款基于.NET8的跨平台高性能边缘采集网关的开源项目。希望通过这个项目能够帮助......
  • EF Core 索引器属性(Indexer property)场景及应用
    EFCore索引器属性(Indexerproperty)场景及应用简介EFCore中的索引器属性(IndexerProperty)是指通过一个特殊的属性来访问实体类中的数据,而不必明确声明实体属性。这种属性在一些动态或未预定义的场景中非常有用,比如当实体的属性名在编译时并不确定,或者属性名集合较大时。场景......
  • Profibus DP(主站)转EtherNet/IP协议转换网关(通讯配置详解)
    作者的许多朋友均对如何实现ProfibusDP网络和EtherNet/IP网络的连接互通感到十分困扰,现在为大家统一作出解释。事实上,远创智控YC-DPM-EIP此款设备能够完美地解决这一问题。接下来,作者将会给各位全面且详尽地阐述该设备的功能、参数以及配置的方法。产品介绍本产品实现PROFIB......
  • pytorch_geometric的Planetoid出现“TypeError: expected np.ndarray (got matrix)”
    问题和解决方案运行GCN的例子的时候,出现了这个错误:out=torch.from_numpy(out).to(torch.float)TypeError:expectednp.ndarray(gotmatrix)解决方案:在torch_geometric.io.planetoid.py中添加importnumpyasnp,将out=torch.from_numpy(out).to(torch.float)......