unity-热更-InjectFix

1 C#热更新预备知识

1.1 mono.cecil注入

使用Mono.Cecil实现IL代码注入

注入之后修改dll,新增mdb文件:

注意,待了解参数注释打开会报错:

1.2 InjectFix

  • 安装
    你试试用mcs可以不,你把第二行改为
    @set GMCS="%UNITY_HOME%EditorDataMonoBleedingEdgeinmcs.bat"

2 使用

2.1原理

2.2特征和支持

优点: (小、安全、其他dll、免代码)
    1. 运行时非常小巧,仅100K左右,比各lua方案,ILRuntime都要小很多,而且不依赖第三方库,纯C#实现;
    1. 支持每个游戏生成一份自己私有的补丁格式,私有的指令定义。这样相比通用的lua原代码,lua字节码,clr程序集都更安全些。
    1. 支持Assembly-CSharp.dll之外的dll的修复。
    1. 免代码生成,更干净。
  • 不需要提前对代码(发布的代码)做标记,如[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;
原文地址:https://www.cnblogs.com/Jaysonhome/p/12996853.html