【dotnet】Unity 两种打包方式解析(IL2CPP Mono)

背景

Unity的脚本资源是以dll文件的方式存在于磁盘上,在Unity中进行打包时,有两种打包方式选择:MonoIL2CPP
在这里插入图片描述

Mono 介绍

Mono打包后文件中存在大量动态链接库文件(.dll后缀文件),也包括mono虚拟机文件(libmonobdwgc-2.0.so和libMonoPosixHelper.so),在运行程序时dll文件会加载到mono虚拟机中

Mono脚本编译流程

在Unity编译打包时,使用C#书写的脚本会经过Mono的C#编译器打包为中间语言IL(Intermediate Language,IL语言所在的文件就是.dll后缀的文件),然后和其他dll文件一起在Mono虚拟机(Mono VM,Mono Virtual Machine)中运行。中间语言IL的存在主要是为了平台的兼容性,因为不同指令集平台执行同样的程序的具体机器语言并不是相同的,如果打包时直接将程序翻译为机器语言,那么打包后的程序包就只能在指定平台上运行,所以我们在打包时先将程序编译为中间语言IL,在不同的平台上使用Mono虚拟机(不同平台有自己的虚拟机,这个mono就很牛逼,做了很多平台的vm)将IL相应地翻译为该平台的机器语言执行。

但是Unity这样支持多平台的引擎,Mono官方的VM肯定是不能满足需求的,这个后面就引出了IL2CPP,后话了。
在这里插入图片描述

IL2CPP 介绍

IL2CPP 是 Unity 自 4.6.1p5版本 新的 scripting backend 方式,为Unity提供了更加高效、更加便携的虚拟机。IL2CPP打包后没有了dll文件,Unity主工程的dll文件(Assembly-CSharp.dll)和Mono虚拟机文件集成为IL2CPP虚拟机文件(libil2cpp.so)。

IL2CPP主要由两部分组成:

1.AOT静态编译编译器(il2cpp.exe),将IL转换为C++源码,再交给各平台的C++编译器进行编译,达到平台兼容的目的

2.运行时库(libil2cpp),运行时库则会提供诸如垃圾回收、线程/文件获取、内部调用直接修改托管数据结构的原生代的服务与抽象

在这里插入图片描述

IL2CPP 脚本编译流程

在Unity编译打包时,IL2CPP模式同样先将工程中的文件编译为IL,但是IL2CPP不会直接在虚拟机中运行这些IL,而是将工程IL和其他IL一起使用IL2CPP将这些IL变回CPP(C Plus Plus或C++)代码,然后再将C++代码放到本地编译器(具体运行的机器平台的编译器)上编译为能执行的原生汇编代码,再使用自研IL2CPP VM运行。

总结

unity mono和il2cpp真的完全两种路子,mono是基于开源的mono,我将c# 语言转为IL,然后其在各个平台都实现了CLR(用于运行IL),可以运行IL,就这么简单粗暴,类似Java
另外一种是il2cpp自研方式,我还是利用mono将c# 转为IL,然后就不一样了,我将IL转成cpp代码,如将dll转为cpp代码。。。然后利用各个平台编译cpp代码的轮子编译cpp代码,再造一个vm可以进行垃圾回收等等操作,我不在.net平台上玩了

猜你喜欢

转载自blog.csdn.net/qq_22849251/article/details/126683374