JIT 与 C#热更 - IT技术 - MSIPO技术圈
C#程序发布时,一定要好好地保护,不然你会后悔的c# 混淆保护编程乐趣的博客-CSDN博客
C#程序采用AOT发布,真的可以避免被反编译?_编程乐趣的博客-CSDN博客
1.AOT(Ahead of time)
预编译,类似宏定义之类的东西。
2.JIT(Just in time)
实时编译
第一次执行->编译成中间字节码
后续执行->直接执行字节码
中间字节码:并非机器码,但是程序执行时仍需动态将字节码转为机器码。
通常区分是否为AOT的标准:看代码在执行之前是否需要编译,只要需要编译,无论编译产物是字节码,还是机器码,都属于AOT。
3.JIT与热更新
资源热更新很容易,Unity的AB包就可以解决。
代码热更新,因为Unity中的c#是编译型语言,Unity在打包后,会将c#编译为一种中间代码,再由Mono虚拟机,编译成汇编代码,这样能支持多平台。它打包后,就变成二进制了,会跟着程序同时启动,无法进行任何修改。
- LUA热更
LUA是解释型语言,不需要事先编译成块,而是动态解释执行的,这样LUA和普通的资源没有区别。 - c#热更
c#可以在安卓上实现热更,但是苹果不行:因为安卓可以通过c#的语言特性:反射机制,实现动态代码加载从而热更。
具体做法:频繁更改模块独立出来做成DLL,主模块调用这些DLL,主模块代码不修改,运行时通过反射加载这些DLL就实现了热更。
但是苹果反射机制有限制,为了安全不允许。 - c#热更—ILRuntime(过去式)
ILRuntime项目为基于c#的平台(如unity)提供了一个纯以实现,快速、方便、可靠的【IL运行时】,使得能够在不支持JIT的硬件环境(如ios)能够实现热更新。
编译原理:把代码分成两个dll文件,启动的时候只启动一个,另一个dll通过反射启动。在每次启动第二个热更的dll时,将第一个dll文件替换掉,来达到一个热更的效果。 - c#热更—华佗(待研究)
4.内联函数
虽然C#不支持inline关键字,但是JIT支持【自动inline】,即将IL转成真正机器码时,会自动将某些函数进行inline展开,只是条件非常苛刻,网上提到JIT自动进行inline展开的一些选择依据:
1)函数内部有循环语句、catch语句等复杂结构,都不做inline优化。
2)函数体比较长的不做inline优化,只有比较简单的才可能inline优化。(有人说IL不足32字节才做inline),
3)编译成机器码时,inline展开的代码比函数调用更短的,一定做inline。(注:如果参数多而代码少,就符合此情况)