2016年,Microsoft正式推出了跨平台新框架.net core 1.0,带给微软系开发者们巨大的鼓舞。常年被Java体系鄙视的开发者们,终于有了翻身的机会。 我们也可以跨平台,我们也可以使用k8s,docker容器这些更令人着迷的新技术。
为啥在相隔14年,微软做出了如此巨大的改变,开始拥抱开源呢?我想,这个和现在的云计算,容器技术的普及有着非常大的关系。云计算使得我们的使用的工具不再局限实体的服务器,可以购买云计算供应商的服务来部署我们的系统。对于捆绑开发者,卖系统,卖软件的方式,已然不会有一个好的结局。

那微软到底做了些什么,使得我们的.net的框架可以跨平台了呢?它到底和.net framewrok有着什么不同呢?这篇文章,我和大家聊一聊,希望有不正确的地方,大家能指正。
其实.net core和.net framework发展到现在,基本上已经相差无几了,.net framework有的基础类库,都在.net core里面。因为.net core是重新开发,性能甚至比.net framework更出色!
我画了两个框架的大致架构图,从图里,我们大概就能知道为啥.net core能跨平台。

先大概解释下里面的几个名词:
FCL:Framework Class Library的缩写,我们平时使用C#开发程序的时候,能接触到的一层,里面就是微软为我们封装好的一些基础的类库,并暴露出接口,给我们调用。例如我们读写文件要用到system.io,网络访问要用到System.Net。这就是为啥我们开发一般都是要两个东西,开发语言和开发框架,不然,你写个调用remote api的代码,估计都得大半年。
BCL:Base Class Library的缩写,是更小粒度的基础类库封装,支持所有的FCL,你要是有能力,在他的基础上可以自己写一个FCL。后来为了统一,名字就变成了.net standard libray。这就是我们有时间引用nuget包会有个条件必须>=.net standard 2.0
CLR:Common Language Runtiime的缩写,中文翻译叫公共语言运行时,这个就是整个.net 体系的核心,这个东西会把做以下事情:
1.替我们的程序管理内存,垃圾回收(GC),线程管理,处理程序的异常,帮你调用需要的动态库(DLL)。反正是操碎了心。
2.重点来了。我们写完代码,在visual studio编译的只是中间代码,中间代码在执行之前,都要通过JIT(Just-In-Time)再次编译成操作系统(os)能直接执行的代码,然后操作系统(os)去调用CPU,内存等一系列硬件去完成程序的功能。
怎么去理解这个运行时呢?可以简单的理解一下,就是个虚拟机,你把你写的代码给它,它帮你调用操作系统完成你程序上的功能。

为啥要这个东西呢,我直接编译成机器能执行的代码不行吗?不行呀,没有这个东西,没法跨平台!Java能跨平台,也是因为有这么一层,只是它的名字不一样。其实,.net 的CLR比Java体系JVM性能更强,我后面会专门写篇文章来讲述这一点。
.net framework不能跨平台,那为啥要它,是不是很疑惑?是的,微软扯就扯在这一步,即参考了跨平台架构思想,但是又只实现了windows下的CLR。什么意思?就是压根没有写linux和mac的CLR,中间代码只能转换为windows操作系统可以识别的代码。
.net framework天生就是有跨平台基因的,就是爸爸不给力。原因大家能猜到吧!有时候,船大难调头,估计.net framework的架构师在这一点也是很痛苦!
是不是有点明白了?.net core为啥能跨平台,就很好理解了。
是的,如图上所示,微软重构了CLR,取名为CoreCLR。它可以把你编译的中间代码按照你选的平台编译成操作系统可以识别的代码,这样就可以在windows,linux,mac等系统上运行你的程序。
那它两兄弟有啥不一样呢?其实大同小异。两孩子,家长给的都一样。只是.net core作为后来者,少了.net framework设计上的坑,变得更优秀。
作为程序员,能直观感受到的不同就是.net core配置文件的实现方式改成了json,然后.net framewrok原来的管道变成了现在中间件,其实架构思想都还是一样。
好了,希望这篇文章能够给你启发。这样在和别人争论谁是最好的语言的时候,能做到有理有据!开个玩笑,所有语言都是最好的开发语言!
那为啥.net 5后又把他们合并到一起了呢。我想,可能是弄两套框架,一个是太割裂了,然后就是维护起来估计也是麻烦。毕竟,它两相同的东西还是太多了。现在的架构图大致成了下图所示。

Xamarin原来是一个独立公司弄的,专门用来开发跨平台APP,估计是太喜欢C#,另辟蹊径,坚持要用C#和.net framework(实际是Mono,也算这个体系的吧)来开发IOS和Android,也算为.net 体系在移动应用上留下了一点火种。希望大家也能对自己喜欢的人或事,一直坚持下去。后面这个项目被微软收购了,作为APP开发的落后者,也算是补齐了短板。
现如今,随着.net 体系完全开源和支持跨平台,生态也在向着好的方向发展。现在也有了一些比较优秀的开源项目,如ABP VNext , Ocelot,这些优秀的项目,正在追赶Java体系的开源框架。也希望有朝一日,使用.net 体系的公司做大做强以后,能自研出更多的开源框架。
如果你觉得我的文章还不错,欢迎关注,转发和评论。大家也可以在微信公众号搜索"墨汁软件"关注我哟!

3191

被折叠的 条评论
为什么被折叠?



