1 C#热更新预备知识
1.1 mono.cecil注入
注入之后修改dll,新增mdb文件:
注意,待了解参数注释打开会报错:
1.2 InjectFix
- 安装
你试试用mcs可以不,你把第二行改为
@set GMCS="%UNITY_HOME%EditorDataMonoBleedingEdgeinmcs.bat"
2 使用
2.1原理
2.2特征和支持
优点: (小、安全、其他dll、免代码)
-
- 运行时非常小巧,仅100K左右,比各lua方案,ILRuntime都要小很多,而且不依赖第三方库,纯C#实现;
-
- 支持每个游戏生成一份自己私有的补丁格式,私有的指令定义。这样相比通用的lua原代码,lua字节码,clr程序集都更安全些。
-
- 支持Assembly-CSharp.dll之外的dll的修复。
-
- 免代码生成,更干净。
- 不需要提前对代码(发布的代码)做标记,如[patch],只需要制作补丁的时候标记
- 修改函数
- 新增类(Interpret)
- 新增函数 (Interpret)
缺陷:
- 1 不能是泛型方法,构造方法
- 2 方法执行中,如果出现调用基类方法,是通过一个代理方法实现的。
- 3 新增struct类型很困难。
- 4 新增class或新增struct无法继承基类(struct可继承自Interface)。
- 5 无法在已有类新增字段
- 6 借助它来实现新功能的热发布有难度
2.3规则和约定
- 1 Inject过后的工程,不能拿来Fix操作去得到补丁。(报错会提示reimport)
- 2 C#编译后(修改代码),需要重新注入Inject
- 3 [Interpret]标记的新增类,补丁里有了,原版本的C#工程就不能有重复。([patch]无所谓,新增函数无所谓)
其他
iOS禁止APP创建可写可执行的内存页,而这是JIT必须的
- 执行文件大小限制
执行文件大小是指执行文件的__TEXT部分
当IOS最低版本小于7.0,32位+64位最多为80MB;
当IOS大于等于7.0,每个分区是60MB(并不是指32位+64位最多为120MB,当32位分区占用50MB,64位分区占用61MB,总111MB也不行,因为64位分区超出了);
当IOS大于等于9.0,总限制400MB;