1 C#熱更新預備知識
1.1 mono.cecil注入
注入之后修改dll,新增mdb文件:
注意,待了解參數注釋打開會報錯:
1.2 InjectFix
- 安裝
你試試用mcs可以不,你把第二行改為
@set GMCS="%UNITY_HOME%\Editor\Data\MonoBleedingEdge\bin\mcs.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;