跳到主要内容

Il2Cpp 实现

包内镜像: Packages/com.code-philosophy.zts/ZTS~/zts-runtime(Install → Local…/libil2cpp/zts开发编辑参考: 导出工程 Build-Win64/.../libil2cpp/zts(改完再 sync 回包;路径以团队仓库为准) 托管壳: ZTS.Il2Cpp / TsIl2CppAppDomain(薄 InternalCall) JS 可见语义: spec — 本文只描述 C++ 模块划分、Generate / ReducedType、初始化顺序。


1. 模块图(高阶)

Player 热路径在 zts-runtime(运行时目录名 zts)。与 Mono Runtime/Mono/ 按职责对照:

zts/ (← ZTS~/zts-runtime)
├── lvm/ 宿主生命周期、JS 状态、ZTSLib、InternalCall、Loader
├── mt/ 类型注册、成员索引(Dispatch* + MetaBinding / TypeRegistry)
├── marshal/ Push/Pop、Registry、MarshalMeta、Overload 解析
├── bridge/ Method / Property / Field / Delegate 调用体
├── generated/ 构建期 Codegen 产物(stub 表、BuiltinScripts.inc、ZTSConf.inc)
├── utils/ 横切:元数据、异常、栈守卫、分配器
└── ZTSCommon.* 公共头、Compatible shim、与 QuickJS / Il2Cpp ABI

依赖方向(硬约束,与 ZLua 同构):

  • marshal/ 不得依赖 mt/(Mt 经 hooks / 上层装配)
  • bridge/ 可依赖 marshal/generated/
  • generated/ 仅被 lvm/bridge/ 等引用;不参与随意运行时分支

QuickJS 源码在 libil2cpp/quickjs(Install 自 ZTS~/quickjs-il2cpp);与 zts 静态编进同一 native 产物。见 11-MULTI-VERSIONbuild/01-QUICKJS

具体 .cpp 文件名以包内树为准;上表只保证 角色 稳定。ZTSLib 注册点见 05-LIBlvm/ZTSLib.cpp)。


2. Generate stubs 与 ReducedType

Il2Cpp 不能在 Player 上 Expression Emit。构建期扫描绑定集合,生成 C++ 桥:

产物(概念)职责
MethodBridge stub 表JS→C# 方法 invoker;相同 ReducedType 签名 复用 一条桥
Property / Field bridgegetter/setter、字段 offset + methodPointer 快路径
DelegateBridge stubDelegate ↔ JS function;C#→JS GetFunction 亦经 Delegate 桥
MarshalAs / Alias / Extension 表预编译 XML 与 Attribute 一并 Generate;Player 不读 XML
BuiltinScripts.inc嵌入 ztslib.js
概念说明
ReducedType将 CLR 签名归约为可复用的 native 调用形(参数槽 / 返回 / byref 等);同形共享 stub,避免「每成员一个独立 C 函数」膨胀
未覆盖签名构建期或首次绑定失败(MethodBridge 等),见 01-HOST-API §7
与 MonoMono 为 每成员完整签名 Emit;语义一致,复用策略不同

流水线概念:设计概览 · 构建步骤:guides/build


3. 初始化顺序

3.1 AppDomain 级(进程 / 域)

托管 TsIl2CppAppDomain.Initialize → native(概念顺序):

步骤职责
1绑定期元数据堆 / Metadata 缓存初始化
2Property / Method / Delegate Bridge::Initialize — 加载 generated/ stub 表
3核心 InternalCall 注册
4Loader 根 / 搜索路径(若有)
5JS 状态级 Initialize(下节)
6安装托管 moduleLoader delegate
7注册 TsFramePump

进程级 Bridge / XML 生成表 / InternalCall 在 Reset 时保留

3.2 JS 状态级(主 JSContext

步骤职责
1创建 JSRuntime + 主 JSContext单上下文
2注册 globals / 嵌入脚本;ZTSLib::RegisterGlobals + ztslib.js
3ObjectRegistry / Struct registry / MetaTable 缓存
4安装 ES module hooks( csharp:,再原生 C 模块,再宿主 loader)
5AssemblyRegistry / CSharp
6(可选)struct GC root 回调等

Reset: 预约 → EndOfFrame:排空 pending ref → Registry shutdown → 释放 context → 按 §3.2 重建。权威:10-LIFETIME §7。

已初始化时再次托管 Initialize → 抛异常(须 Reset)。


4. 文件职责(按目录摘要)

lvm/

宿主入口、JS 生命周期、pending ref 队列、ZTSLibzts.* native)、InternalCall、模块 loader 与托管 delegate 对接。

mt/

CSharp / 程序集懒加载、EnsureBinding 语义的 native 侧、MetaBinding 扫描、三表填充、Dispatch* 挂载、类型门面(reference / valuetype / array / enum)。

marshal/

Il2CppType* 的 Push/Pop、ObjectRegistry(ByObj GC root)、Struct registry、Delegate / Opaque / Array / Primitive、overload resolver。语义见 spec/marshal

bridge/

MethodBridge(stub 查表 → invoker)、Property / Field bridge、DelegateBridge(含 GetFunction 调用路径)。

generated/

构建产出,勿手改。 stub 头、BuiltinScripts.incZTSConf.inc(Install/Generate 宏)等。

utils/

类型/方法元数据查询、异常边界、栈守卫、绑定期分配器。


5. 与 Mono 的对照要点

维度Il2CppMono
成员索引Dispatch* + MetaBindingExotic 三表 indexer
JS→C#Codegen stub + ReducedType 复用Emit 每成员
C#→JSGetFunction + Delegate 桥同左
Eventadd_* / remove_* 普通方法同左
源码权威zts-runtime / 导出工程 libil2cpp/ztsRuntime/Mono/

对照 MONO


6. 关联文档