• 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;
  • 相关阅读:
    08day 操作命令以及目录结构
    换工作
    json转为字典
    快速排序
    冒泡排序
    python函数-生成器
    关键字global
    函数的定义和参数调用
    count()函数与center()函数
    python字符串常用函数:strip()
  • 原文地址:https://www.cnblogs.com/Jaysonhome/p/12996853.html
Copyright © 2020-2023  润新知