为什么需要 LeanCLR
背景:嵌入 C# 到宿主
许多产品需要在 C++ / 原生引擎中运行 C# 逻辑,并将同一份代码发布到多个平台。常见路径包括 CoreCLR、Mono、IL2CPP,但在「轻量嵌入 + 多 平台发布」这一组合目标下,它们往往存在明显代价。
与 CoreCLR / Mono 的对比
| 维度 | CoreCLR / Mono | LeanCLR |
|---|---|---|
| 运行时体积 | 较大 | 极小(x64/WASM 上单线程版本可至数百 KB 级) |
| 外部依赖 | 多 | 以 C++ 静态库为主,宿主集成简单 |
| 嵌入成本 | 高,裁剪与移植复杂 | 低,接近嵌入脚本引擎 |
| 典型用途 | 桌面/服务器完整 .NET | 发布管线中的嵌入式 CLR |
CoreCLR 与 Mono 能力完整,适合作为通用 .NET 运行时;但当目标是「把一小段 C# 打进游戏或嵌入式固件」时,它们的体积、依赖与集成复杂度往往过高。
与 IL2CPP 的对比
| 维度 | IL2CPP | LeanCLR |
|---|---|---|
| 开源 | 否 | 是(MIT) |
| 引擎绑定 | 强依赖 Unity 工具链 | 可独立嵌入,亦有 Unity 插件 |
| 执行模型 | 仅 AOT | AOT + 解释器混合 |
| ECMA-335 覆盖 | 受 Unity 裁剪与工具链约束 | 以高 ECMA-335 兼容为设计目标 |
| 跨引擎 | 否 | 是(Unity 已支持,Godot / UE / Cocos 规划中) |
IL2CPP 在 Unity 生态中成熟,但闭源、与 Unity 强绑定,且对 ECMA-335 的覆盖有限。LeanCLR 旨在提供可独立集成的开源替代方案。
LeanCLR 的定位
LeanCLR 补足的是:在保持高 ECMA-335 兼容的前提下,提供易集成、体积可控、可跨引擎嵌入的发布期 CLR。
它不与 HybridCLR 等热更新方案竞争——后者解决的是 Unity 全平台原生热更新;LeanCLR 解决的是发布时替换后端、缩小包体、降低内存。