什么是.NET
.NET是一个开发框架,它遵循并采用CIL(Common Intermediate Language)和CLR(Common Language Runtime)两种约定,
CIL标准为一种编译标准:将不同编程语言(C#, JS, VB等)使用各自的编译器,按照统一的标准编译成语义一致的CIL中间码, 这样虽然代码使用的语言不同,但编译出的产物是一样的。
CLR标准为一种执行标准:不同的操作系统可以根据CLR这一执行标准开发出自己平台的中间码执行器,这样CIL这个标准中间产物就可以在不同的平台执行了。其中Mono框架就扮演了这样一个重要的角色,实现了各个平台的CLR执行器。
.Net拥有跨语言,跨平台性:
-
跨语言:就是只要是面向.Net平台的编程语言,用其中一种语言编写的类型就可以无缝的在另外一种语言编写的应用程序中互操作。
-
跨平台:一次编译,不需要任何代码修改,应用程序就可以运行在任意在.Net实现的平台上跑,即代码不依赖于操作系统,也不依赖硬件环境。一个.Net程序运行的核心在于.Net
CLR(公共语言运行时,或者称为.Net 虚拟机,类似java虚拟机的概念),为了让.Net程序在其他平台(目前只能在.Net 平台,windows系统)上跑,微软官方还推出了在其他平台(MacOs,Linux)跑的
.Net的实现,就推出了.Net Core。
然而,Unity引擎需求也是需要跨平台,支持多语言(C#,Js,Boo)。就参考微软开发.Net Core的概念,于是,推出了Mono.
画个图简单对比一下:
到这里,基本说明了.Net 与Mono和Unity的联系关系,其实没啥关系。做游戏都知道,肯定需要跨平台,不能只支持一种平台,不然每个对应的平台做出一种对应的编译器,那真的会累死。所以对于跨平台的需求,对于游戏开发而言,很重要。Unity的架构需求设计当然也需要这个特性。参考.Net依托CLR来实现设计思路,于是Mono就出来了。
什么是Mono
Mono是一个框架,它是.NET这个开源框架的子集,它建立在.NET框架基础上,在使用.NET基础能力的基础上,自己做了多各个操作系统的CLR实现来实现跨平台。同时也重写了一些.NET框架中的基本功能。
mcs编译器: C#编译器,C#编译为IL中间指令。
Unity跨平台的原理: 就是Mono运行时编译器支持将IL代码转为对应平台原生码,IL可以在任何支持CLI(Common Language Insfrastructure,通用语言环境结构)中运行,IL的运行是依托Mono运行时。
IOS不支持jit编译原因:机器码被禁止映射到内存,即封存了内存的可执行权限,变相的封锁了jit编译方式,详情参考:https://www.cnblogs.com/murongxiaopifu/p/4278947.html
JIT编译: 将IL代码转为对应平台原生码并且将原生码映射到虚拟内存中执行。JIT编译的时候IL是在依托Mono运行时,转为对应的原生码后在依托本地运行。