UH4L18——基本原理
UH4L18——基本原理
ILRuntime基本原理
ILRuntime借助Mono.Cecil
库来读取DLL中的IL汇编码,然后通过内置的IL解释执行虚拟机来执行DLL中的代码
C#的运行机制
该知识点在 Unity进阶之C#知识补充 中详细讲解过,详见:CS5L1——.NET相关知识
C# 通过C#编译器 生成 对应的 CIL(通用中间语言)
然后通过 CLR(公共语言运行时)将 CIL 解释翻译 为最终的机器码,运行在平台上
那么我们生成DLL文件,其中存储的就是我们的 CIL 中间语言,我们可以通过 反编译工具 ILSpy 来查看对应的 IL 中间代码
注:上图不是ILSpy而是dySpy,就查看IL中间代码的能力是一致的,dySpy已停更
ILSpy获取地址:icsharpcode/ILSpy (github.com)
IL的汇编代码中有很多的指令信息,如果想要学习他们,可以前往微软官网查看具体的IL汇编指令的作用
OpCodes 类 (System.Reflection.Emit) | Microsoft Learn
ILRuntime实现热更新的基础——Mono.Cecil库
在第一节课搭建环境时,我们就提到过Mono.Cecil
库,它是一个第三方库,主要作用有:
- 读取C#编译的DLL
- 可以读取到DLL中的类型和方法元信息
- 可以读取方法体中IL汇编指令
- 可以读取PDB调试符号表文件
- 可以修改DLL中的元信息和方法体内容并写回DLL
由于它的这些功能,所以被广泛的应用于各种热更方案中,比如xlua和tolua,而ILRuntime也是基于它来完成我们的热更功能的
ILRuntime自己实现了:
- 解释器:ILRuntime基于
Mono.Cecil
获取 DLL 文件中的 IL 代码,将他们基于自己的规则翻译并执行
ILRuntime实现的解释器相当于就是一个基于C#的解释执行引擎 - 类型系统:用于表示原始工程和热更工程中的各种类型、方法、成员、实例对象等等信息
相当于,ILRuntime帮助我们利用它内部的解释器,将我们实现的代码解释翻译为了自己的一套类型规则
在真正执行代码时,都是基于ILRuntime自己的类型系统中的规则来执行的
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 文KRIFE齐的博客!