.Net Core与Mono的关系

前言:

unity游戏开发过程中,接触到了一些关于敌人AI逻辑,在软件业务里,当需要添加功能、又不能改变原有的程序结构时。可以用到依赖注入的方法,实现依赖倒转原则,即里氏原则,实现了面向对象编程。这个过程又叫做面向接口编程。一般这种编程方式或者说设计模式,在基础的前端游戏开发计算机图形学初级开发中,比较不容易遇到,反而在.Net Core的web开发中,为了保证业务的安全性、与可扩展性,较为常见。于是,联想到应该熟悉Mono开发的底层逻辑。了解Mono的来龙去脉。

一、用Mono构造最精简的.net运行环境

为了揭示Mono与.net的关系,用mono构造最精简的.net运行环境发现:   

最基本的文件依赖

bin\mono.exe

bin\mono-20.dll

lib\mono\2.0\mscorlib.dll(多语言标准通用对象运行时库)

这三个文件是最基本的。只要有这三个文件,就可以运行控制台下的helloWorld。

用Mono构造最精简的.net运行环境 - 郑文亮 - 博客园

二、从unity C#编译器的升级,理解mono。

using UnityEngine;
using System;
using System.Reflection;

public class MonoVersion : MonoBehaviour {
	void Start()
	{
		Type type = Type.GetType("Mono.Runtime");
		if (type != null)
		{
			MethodInfo info = type.GetMethod("GetDisplayName", BindingFlags.NonPublic | BindingFlags.Static);
			
			if (info != null)
				Debug.Log(info.Invoke(null, null));
		}
      //Debug.Log(System.Enviroment.Version);//net version?
	}
}

输出6.13.0 (Visual Studio built mono)

在Mono官网(Home | Mono)给出了Mono的定义:

Sponsored by Microsoft, Mono is an open source implementation of Microsoft's .NET Framework based on the ECMA standards for C# and the Common Language Runtime. A growing family of solutions and an active and enthusiastic contributing community is helping position Mono to become the leading choice for development of cross platform applications.(Mono是微软发起的,为了支持C#和CLR的跨平台应用基于ECMA标准制作的,开源的.Net FrameWork框架。)

2.1 Mono与.Net FrameWork的关系(About Mono | Mono)

.NET和Mono两者是完全独立的,简单的理解:Mono项目是第三方的.Net Framework实现,比喻为.Net的跨平台版,绝大多数C#的特性在.net和mono中都是相同的,少部分特性两者的实现不一致。

Mono的目标是创建一系列符合ECMA 标准(Ecma-334 Ecma-335)的.NET 工具,包括C# 编译器和共通语言执行平台

Mono 虚拟机包含一个实时编译引擎,该引擎可用于如下处理器:x86,SPARC,PowerPC,ARM,S390(32位模式和64位模式),x86-64,IA64 和64位模式的 SPARC。该虚拟机可以将代码实时编译或者预先编译到原生代码。对于那些没有列出来的系统,则使用的是代码解释器。

2.2 Mono 与C# Compiler

mono的c#编译器提供c# 1.0,2.0,3.0,4.0和5.0(ECMA)完整的功能。不同版本的特性的描述可以在维基百科上查看。

2.3 Mono 与 Mono Runtime

mono运行时实现了ECMA 公共语言基础(CLI)。运行时提供了即时(JIT)编译器,提前的编译器(AOT),库加载器,垃圾回收机器,线程操作,互操作性

2.4 Mono 与 .Net Frame Class Libray

Mono平台提供了一组全面的类来构建应用程序提供一个坚实的基础。这些类是兼容微软的.Net framework

2.5 Mono 与 Mono Class Libray

Mono还提供了很多类,甚至超越了微软提供的基类库。这些提供额外的功能是有用的,特别是在构建Linux应用程序。一些例子是Gtk +,Zip文件、LDAP、OpenGL,Cairo,POSIX等等。

2.6 .Net 与Mono版本关系

三、从.Net 的实现,来看Unity 与Net 、Mono 、IL2CPP的关系。(浅谈Unity与.Net、Mono、IL2CPP_Hello Bug.的博客-CSDN博客_.net unity

3.1 .Net的概念

.Net是微软的一种技术平台/一种规范,而不是一种语言,可以理解为接口
.NET平台支持多种语言开发:C#、F#、Visual Basic等
目前.Net有三种主流实现
——.Net Framework:主要是基于Windows上开发
——.Net Core:支持跨平台开发
——Mono:支持跨平台开发

3.2 .Net代码的编译过程(C# 实现跨平台,是CLR转成的CPU指令,即运行在虚拟机上)

首先我们写的代码通过特定语言的编译器编译成CIL(Common Intermediate Language:中间语言,也可以称为IL或MSIL),它是一种托管代码类似于Java的虚拟机,它会存储在.DLL或.EXE的程序集中,CIL是一种伪代码不能被计算机直接识别。它与平台操作系统无关与CPU无关,这也为跨平台奠定了基础之后在程序运行时再通过CLR(Common Language Runtime:公共语言运行时)内部的JIT编译器将CIL编译成计算机可以识别的CPU指令(机器码:01010101),IL语言对于CLR来说是透明的,CLR并不知道IL是由哪种语言编译而来这是一个二次编译的过程.

3.3 Mono的组成,

 ——C#编译器:C#编译器称为mcs,可以完成C#的编译工作,作用就是将C#源码编译成中间语言CIL,在非Windows平台上需要Mono运行时来运行,而在非Windows平台上既可以用.Net运行时,也可以使用Mono运行时
——Mono运行时(Mono VM): 实现了ECMA公共语言架构,提供了一个即时编译器(JIT)、预编译器(AOT)、类库加载器、垃圾回收器、线程系统和互操作性功能
——基础类库(.Net类库):提供一组全面的类,这些类兼容.Net框架并保持一致,时候构建程序的结实基础
——Mono类库:提供了很多超越基础类库的类,提供了额外的功能,例如一些处理Gtk+,Zip文件,LDAP,OpenGL、Cairo、POSIX等等
3.4 Mono 运行时的概念

C#编译器mcs的作用是将C#源码编译成中间语言CIL,Mono运行时的作用是将CIL转换成机器语言
Mono运行时提供了三种转译方式
——即时编译(JIT):在运行过程中,将CIL编译成机器码。它是在程序运行时才编译代码,解释一条语句执行一条语句,同时也会将编译过的代码进行缓存,而不是每一次都进行编译
——提前编译(AOT):在运行前,将CIL编译成机器码并储存起来,但还是有一部分编译需要用到JIT
——完全静态编译(Full AOT):在IOS平台上是禁止JIT的,所以Mono只能以Full AOT模式运行。及其器码被禁止映射到内存,即封存了内存的可执行权限,变相的封锁了jit编译方式
3.5 IL2CPP

由于Mono的一些不足而引发出了一种新的解决方案:IL2CPP,在得到中间语言IL后,使用IL2CPP将他们重新变回C++代码,然后再由各个平台的C++编译器直接编译成能执行的机器码
IL2CPP很好理解她的含义:将IL代码转换成CPP文件
现在的大趋势都是把语言加上动态特性,哪怕是C++这样的静态语言,也出现了适合IL的C++编译 器,那为什么Unity要把IL再转回静态的CPP呢?原因如下:
——Mono VM在各个平台移植,维护非常耗时,有时甚至不可能完成
Mono的跨平台是通过Mono VM实现的,有几个平台,就要实现几个VM,像Unity这样支持多平台的引擎,Mono官方的VM肯定是不能满足需求的。所以针对不同的新平台,Unity的项目组就要把VM给移植一遍,同时解决VM里面发现的bug,这非常耗时耗力。而且有些平台无法进行移植
2.Mono版本授权受限
因为Mono的授权受限,Unity无法升级Mono版本导致一些新的C#特性无法使用,如果换作是IL2CPP,IL2CPP VM这套完全自己开发的组件,就解决了这个问题
3.提高运行效率
根据官方的实验数据,换成IL2CPP以后,程序的运行效率有了1.5-2.0倍的提升.

四、.Net Core与Unity的未来.NetCore + Unity = 未来_BennyChao的博客-CSDN博客

.Net Core 可能更适合做为Unity 的后端。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值