核心知识点:Huatuo (HybridCLR) 特性、AOT/JIT 编译概念、IL2CPP 底层原理、AssemblyDefine 程序集划分、环境安装配置、热更新 DLL 产出、热更 Demo 流程、与 xLua 热更新横向对比、版本限制
一、Huatuo (HybridCLR) 项目简介
1 概念
HybridCLR(旧名华佗 Huatuo),Unity 原生 C# 热更新开源框架;不依赖 Lua,直接使用 C# 完成热更新,从 IL2CPP 底层做扩展。
2 特性 & 规则
-
特性完整:完整支持 C# 全部语法,泛型、反射、多线程、继承、重载全部原生支持;
-
零开发成本:业务全部写 C#,不用学习 Lua 整套语法、交互桥接;
-
高性能:编译执行,性能远高于 Lua 解释执行;
-
低内存:不存在 Lua‑C# 虚拟栈交互开销,内存开销更低;
-
版本硬性限制:仅支持 Unity2019.4 及以上版本;2017/2018 项目无法使用;
-
底层原理:扩展 IL2CPP 工作链路,支持运行时动态加载AOT 补充 dll 程序集。
对比旧方案:xLua/Tolua 需要写 Lua 脚本做热修复;ILRuntime 使用 JIT,iOS 平台禁止 JIT,商业项目逐步淘汰。
3 语法 & 概念
AOT (Ahead‑of‑Time):提前预编译;打包阶段把 IL 转 C++ 再编译为机器码;IL2CPP 默认全部代码走 AOT。 JIT (Just‑in‑Time):运行时动态编译;iOS 系统安全策略禁止 JIT,所以 ILRuntime 在 iOS 平台不可用。
4 相关知识点对比
| 方案 | 开发语言 | 新增学习成本 | 性能 | iOS 支持 | 能力限制 |
|---|---|---|---|---|---|
| xLua Hotfix | C#+Lua | 高,学 Lua、桥接、Hotfix 标签 | 差 (解释执行) | 支持 | 只能替换已有函数,不能新增类;类必须提前打 Hotfix 标签 |
| ILRuntime | C# | 中等 | 一般 | ❌不支持 (iOS 禁用 JIT) | JIT 方案,移动端上线受限 |
| HybridCLR(Huatuo) | 纯 C# | 几乎无,沿用原有 C# | 高 (编译执行) | ✅完整支持 | 可以新增类、新增方法,不需要提前打标签 |
5 模块拓展
国内很多商业手游项目已经大规模采用 HybridCLR 作为主热更新方案。
二、底层基础概念:IL2CPP、DLL、AssemblyDefine 程序集
1 IL2CPP 完整工作流程
-
C# 源码编译 → IL 中间语言;
-
IL2CPP 工具把 IL 翻译成 C++ 源码;
-
C++ 编译器编译为平台机器码;
-
HybridCLR 扩展该流程,支持运行时额外加载未参与打包 AOT 的 dll。
2 DLL 动态链接库
概念
DLL 动态链接库,存储 IL 中间代码、元数据;逻辑可以和主程序分离;热更新就是下载外部 dll,运行时加载进内存。
3 AssemblyDefine(程序集定义文件)
1 概念
.asmdef文件,逻辑层面划分程序集;不是实体资源,只做编译分组;把不同脚本划分到不同 dll。
2 特性 & 规则
-
默认所有脚本归属于
Assembly‑CSharp.dll; -
创建 asmdef,脚本放到对应文件夹,编译后生成独立 dll;
-
工程大项目可以拆分多个 asmdef,修改某模块只重编译对应 dll,大幅缩短编译时间;
-
热更新业务脚本全部放到独立热更 asmdef,打包产出独立热更 dll,用于后期下发更新。
3 语法 & 操作要点
Project 窗口右键 → Create → Assembly Definition;创建
.asmdef,脚本所在文件夹指定归属。
4 相关知识点对比
不划分 asmdef VS 划分多程序集
不划分:全部脚本在同一个 dll;改动任意脚本,整个工程全部重编译,大工程编译很慢; 划分 asmdef:修改脚本只重编译对应程序集,编译效率提升。
5 模块拓展
热更 asmdef 配置中标记为 HybridCLR 热更程序集。
三、HybridCLR 环境安装
1 概念
两种安装方式:Git URL 在线安装、下载压缩包手动导入 Package。
2 特性 & 规则
-
前置条件:Unity 安装对应版本
Windows Build Support(IL2CPP)模块,缺少该模块 HybridCLR 无法工作; -
在线安装:Package Manager → Add package from git URL,输入仓库地址,可直接更新版本;
-
离线压缩包:下载 zip,解压放到 Packages 文件夹,无法自动更新,新版本需要手动重新下载替换。
-
安装完成后会在 Unity 菜单栏出现 HybridCLR 工具菜单。
4 相关知识点对比
Git 在线安装 VS 离线压缩包
Git URL:一键更新到官方最新版本;需要网络; 离线包:无网络环境可用;版本更新需要手动重新下载。
5 模块拓展
安装完成后需要做项目基础配置:脚本后端设置 IL2CPP,API 兼容版本选择.NET Framework。
四、完整 Demo 业务流程
1 概念
最小 Demo 演示:把热更脚本放到独立 asmdef,打包产出热更 dll;放到 StreamingAssets;主工程启动加载 dll,反射执行热更新业务逻辑。
2 特性 & 规则
-
项目分为两部分: 宿主工程(主包代码):加载器、UI、基础框架;打包进安装包,不会热更 ; 热更新程序集:所有要热更的脚本,归属独立
HotUpdate.asmdef;打包产出hotupdate.dll;后期下载替换这个 dll 实现更新。 -
工作流程
-
创建热更新文件夹,新建
HotUpdate.asmdef;热更脚本全部放入该目录; -
宿主脚本(不在热更 asmdef)写加载逻辑;
-
调用 HybridCLR 工具菜单生成热更补充 dll;
-
将产出 dll 复制到
StreamingAssets;后缀改为.bytes当作二进制资源; -
宿主启动读取字节数组,HybridCLR 加载热更 dll;
-
通过反射找到热更 dll 中的类型,实例化对象,调用业务函数。
-
-
后续上线真实项目: 不放在 StreamingAssets;AB 包把 dll 打进去;客户端网络下载 dll 保存
PersistentDataPath;再加载执行。
3 代码片段(宿主加载器示意)
//宿主脚本(属于主包,不属于热更asmdef)
//从StreamingAssets读取热更dll bytes,使用HybridCLR加载
Assembly hotAss = HybridCLR.RuntimeApi.LoadAssembly(hotDllBytes);
//反射拿到热更类
Type hotType = hotAss.GetType("HotLogic.HotMain");
object obj = Activator.CreateInstance(hotType);
hotType.GetMethod("Run").Invoke(obj,null);
4 相关知识点对比
xLua Hotfix VS HybridCLR Demo 流程
xLua:C# 类提前打 Hotfix 标签,Lua 脚本替换原有 C# 方法;不能新增类; HybridCLR:热更 dll 可以包含全新的类、全新方法;不需要提前给主包打标签。
5 模块拓展
业务可以设计一个热更入口类,热更 dll 内部所有其它业务都由这个入口类驱动。
五、高频坑点
1 版本限制
Unity 版本必须≥2019.4;低于该版本 IL2CPP 底层不支持,HybridCLR 无法运行。
2 脚本归属错误
热更脚本必须归属热更 asmdef;宿主加载器脚本不能放到热更 asmdef,否则打包主包缺失核心加载逻辑。
3 dll 后缀
放到 StreamingAssets/AB 包的 dll,修改后缀为.bytes;Unity 识别为 TextAsset 二进制资源,防止被当作普通 dll 解析。
4 区分宿主代码和热更代码
主包(宿主)代码是打包进安装包的;热更 dll 是后期下载;热更 dll 不能直接引用宿主内部私有类型,通过公开接口交互。
综合拓展
1 完整知识链路 AOT/JIT 编译概念 → IL2CPP 编译流程 → DLL 程序集概念 → AssemblyDefine (.asmdef) 程序集划分作用 → HybridCLR 两种安装方式 → 项目配置 IL2CPP 后端 → 划分宿主 / 热更新程序集 → 产出热更 dll → 宿主加载 dll、反射调用热更逻辑。
2 高频 Bug 排查清单
-
HybridCLR 安装报错:Unity 没有安装对应版本
Windows Build Support(IL2CPP)模块; -
热更 dll 加载失败:脚本没有归属正确热更 asmdef;
-
编辑器运行正常,打包运行找不到热更类型:dll 没有正确复制 StreamingAssets,后缀没有改为 bytes;
-
Unity 版本过低:2019 及更早版本不支持 HybridCLR。
3 核心考点 AOT 与 JIT 区别;为什么 iOS 不能用 ILRuntime (JIT);IL2CPP 编译流程;AssemblyDefine (.asmdef) 作用;HybridCLR 的优势;和 xLua Hotfix 能力对比;宿主程序集与热更新程序集划分;热更新 dll 加载流程。
4 进阶拓展学习方向 AB 包打包热更 dll;CRC 版本校验;增量更新;热更层和宿主层接口解耦;内存卸载热更程序集。