unity-熱更-InjectFix - All


1 C#熱更新預備知識

1.1 mono.cecil注入

使用Mono.Cecil實現IL代碼注入

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

注意,待了解參數注釋打開會報錯:

1.2 InjectFix

  • 安裝
    你試試用mcs可以不,你把第二行改為
    @set GMCS="%UNITY_HOME%\Editor\Data\MonoBleedingEdge\bin\mcs.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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM