.Net技术体系
关于.net技术体系,当初我初学的时候在网上看了很多帖子,大多数介绍都是大同小异,复制过来,粘贴过去,没有一个比较好的让我看到非常清晰的体系,大概是牛人都不屑于写这些东西,但是这些东西对于初学者对.net技术的理解是有帮助的,这里我把我整理的技术体系分享出来,供初学者参考,希望你们能理清一个大概的脉络。
在这里我还稍微介绍下微软.net之前的技术:
在没有.net之前,微软平台开发使用VB/C/C++进行桌面开发,当时使用的是Com组件技术,要知道在没有Com组件时程序之间的模块是是绑定在一起的,哪一个模块变动了,都需要改动程序然后重新编译,这是非常麻烦的,通过开发Com组件实现程序的解耦,可将程序以组件的形式进行拆分与组合,当程序升级时,我们只需要升级某一个组件,然后替换即可,当然这里面会有一个问题,就是Com组件需要在windows注册表中注册才能使用,而每一个Com组件都有一个唯一的GUID,不管这个组件是不是原来升级过来的,所以在组件升级过程中,程序需要重新加载该组件的注册表信息以获取新的组件接口来实例化新的组件类完成功能的升级,不然光是替换,是不能完成功能升级的,需要在注册表中修改新组件的注册信息以便应用程序能找到该组件,这里的Com组件通俗点理解就相当于.net 的程序集(.dll)文件,不过com组件是系统cpu能直接运行的二进制可执行文件,而.net 的程序集则需要.net CLR运行解析。
(.net dll也可以注册为com组件,可以实现与com组件互操作)
后来出现了跨平台的Java,微软也跟着出了.net 体系,从体量上来讲,.net是跨语言的,可以支持多语言,但是有一个最重要的弊端,就是不能跨平台,只能局限于在windows平台上使用,这就使得.net技术未能跟上技术发展的潮流,逐渐边缘化,这是不争的事实,不过好在现在已经出现了开源跨平台的.net core,希望.net技术未来能发展好,前言到此为止,直接上体系图。
.NET Framework、.NET Core/.Net、Mono、Xamarin之间关系
截止2017年7月,这些项目均为微软.NET Foundataion旗下开源项目,微软朝着商业和开源两种途径,将.NET平台开源、跨平台化,以适应云计算、移动互联网时代的要求。2000年左右,随着Java在PC互联网时代的流行,微软发布了全新的.NET平台,但是一直迟迟没有开放和跨平台,.NET生态一直局限于Windows平台,与Java相比,生态一直处于劣势;随着2008年,iPhone的发布,移动互联网的兴起,微软自身的移动平台发展毫无起色,在移动开发领域基本上边缘化了,此外,云计算、虚拟化、容器等服务器端技术的兴起,数据中心对于应用开发和部署都有了新的要求。微软终于在2014年开始关注.NET的开源与开放,通过收购第三方公司Xamarin的解决方案,也为跨平台移动开发提供了可能。
.NET Framework只支持在Windows平台上开发和运行,微软商业实现。
.NET Framework:微软2002年2月发布第一个版本,是借鉴Java研发的全新开发平台。该平台提供了完整的Windows软件开发组件,包括编程语言C#、强大的类库.NET Framework、虚拟机CLR,支持Windows窗体应用、移动应用、Web应用等主流应用模式开发。
.NEF Core支持Windows、Linux、macOS上开发ASP.NET、控制台应用,主要用于云计算下的服务器端跨平台开发。开源开放
.NET Core:微软2014年宣布.NET核心库开源,2016年6月发布其实现.NET Core 1.0。Core简单理解就是.NET Framework的开源跨平台实现,主要包括跨平台虚拟机CoreCLR、.NET Framework APIs的实现子集以及新增类库等。开发语言支持C#、F#以及未来的VB,其提供的API类库可以看做.NET Framework的跨平台版本和功能子集、不支持WPF等Windows专有的应用模型。.
.net core 在5.0开始更名为.net,因为.net framework版本为4.x,为避免与.net Framework版本号冲突与混淆,.net core直接跳过.net core 4.0,而后直接为.net 5.0,6.0,7.0.......
Mono是第三方公司实现的开源跨平台.NET解决方案,支持C#在Linux、Unix等平台上开发应用。开源开放
Mono:第三方公司Ximian于2004年6月发布的.NET Framework跨平台实现方案,支持在Linux、Windows、Unix、Android、游戏主机上应用模型。主要依据是微软在2000年12月发布开放标准公共语言基础架构CLI-ECMA-335,实现编译器和虚拟机。
Xamarin专注于提供移动平台的.NET开发解决方案,基于Mono实现,提供Andorid、iOS等主流移动平台开发工具和类库。开源开放
Xamarin:Mono项目成员2011年5月发布的跨平台移动开发方案,使用C#开发本地的Android,iOS,Windows apps应用,其中代码可以跨平台共享,目前该平台已被微软2016年收购,专注于跨平台移动开发领域。
.NET Standard托管框架的每一种实现都有一套自己的基类库。
基类库(BCL)包含诸如异常处理、字符串、XML、I/O、网络和集合这样的类。
.NET Standard是一项实现BCL的规范。由于.NET实现需要遵循这项规范,所以应用程序开发人员就不用担心每一种托管框架实现的BCL不同。
框架类库(FCL),如WPF、WCF、ASP.NET,不包含在BCL中,因此,也就不包含在.NET Standard中。
.NET Standard与.NET实现之间的关系就和HTML规范与浏览器之间的关系一样。后者是前者的实现。
因此,.NET Framework、Xamarin和.NET Core,每一种托管框架都实现了.NET Standard中的BCL。随着计算机工业不断推出新的硬件和操作系统,将来还会出现新的.NET托管框架。该标准让应用程序开发人员知道,他们可以依赖于一套始终如一的API。
每个.NET版本都对应一个.NET Standard版本。
API一致,将应用程序移植到不同的托管实现以及提供工具都会更简单。
.NET Standard被定义为一个单独的NuGet包,因为所有的.NET实现都必须支持它。工具变得简单了,因为对于特定的版本,它们有一套相同的API。你还可以针对多个.NET实现构建一个库项目。
你还可以构建特定平台API的.NET Standard封装器。
.NET Standard vs 可移植类库
可移植类库做的不是同一件事吗?
可移植类使用多个平台均都支持的通用API。因此,支持的平台越多,可用的API就越少,而且,对于特定的平台组合,很难知道到底支持哪些API。对于一个新平台,已有的PCL必须重新编译。PCL还需要微软针对每个平台创建一个新的框架实现分支。
由于.NET Standard确定了API,而不是一个实现,所以不需要重新编译应用程序。任何新发布的.NET实现都实现了必须的库。应用程序不需要重新编译就可以运行在新的硬件平台或操作系统上。从理论上讲,在调用API时可能会捕获到NotSupportedException异常,但那种情况应该很少见。
小结
.NET Standard是一项API规范,每一个特定的版本,都定义了必须实现的基类库。