ILRunTime 研究


背景

在一个工程中,业务的组成是由各个类文件相互调用所构成的,一旦这个工程进行了打包,所有的调用的关系都已成固定关系在最后的编译文件里面,所以针对当前这个版本的工程包业务功能也就是固定的。如果这个共工程后面要加新的功能,也就要重新添加/调整之前各个类文件的引用/调用关系,然后在进行打包编译,出一个新版本的工程包,对于用户想使用新的工程包,就得删掉以前旧的安装现在新的工程包。那么,有没有办法可以让用户不用进行删除在安装的方式就能使用新的工程包呢?那就是热更,热更有很多方式,目前就研究ILRunTime这一种。

原理

先了解一下正常的C#脚本文件的编译执行的过程,在.NET框架中将脚本语言编译成IL文件,然后在具有CLR的虚拟机上进行解释生成机器码,继而在硬件上执行程序

ILRunTime原理:ILRuntime借助Mono.Cecil库来读取DLL的PE信息,以及当中类型的所有信息,最终得到方法的IL汇编码,然后通过内置的IL解译执行虚拟机来执行DLL中的代码

这段话解释就是,ILRuntime目标是读取热更新的dll,编译成IL,然后使用自己的JIT Compiler来执行热更dll中的代码,达到热更的目的。

既然自己要解释执行,所以对于C#语言的基本类型就要自己进行去定义和处理,自己维护一个调用栈在其虚拟机中

 注意的点

由于ILRuntime和原始的 compiler是两套东西,也就是说你的热更DLL和主工程的DLL实质是不互通的(如热更DLL中一个类要继承主工程DLL的一个类),所以就存在跨域问题

为了解决这个问题,就需要写适配器来进行处理。ILRuntime中跨域继承

相关