LeanCLR 是一个面向生产发布的 CLR实现,核心目标是提供高 ECMA-335 兼容度、低集成复杂度和强跨平台能力,真正实现 “Write C#, Run Anywhere”。
在“将 C# 逻辑嵌入宿主并发布到多平台”这个目标下,CoreCLR、Mono、IL2CPP 通常存在以下限制:
- CoreCLR和Mono:运行时能力完整,但体积、依赖和宿主集成复杂度较高,裁剪与移植成本不适合轻量嵌入式发布场景。移植到新平台的难度高,工程复杂。
- IL2CPP:非开源,与 Unity 生态和工具链强绑定,且仅支持AOT发布,对 ECMA-335标准支持度不高
LeanCLR 的定位是补足上述空白:在保持 ECMA-335 高兼容的前提下,提供易集成、精简高效的跨平台CLR实现。
- 极佳跨平台能力 — 使用AOT + Interpreter 混合执行架构,使用标准 C++11 实现,无任何平台相关依赖。具有极佳的跨平台移植性,不需要任何修改就可以在所有支持标准C++ 11编译器的平台运行。
- 易于集成 — 集成极其简单,复杂度与lua相近,轻松嵌入到任何环境,比如app ,游戏,嵌入式,车机平台,等等
- 高度兼容 ECMA-335:几乎完整支持 ECMA-335 与 CoreCLR 主要扩展,覆盖泛型、异常、反射、委托等核心能力。
- 精简高效 — 非常小巧,内存占用小,运行高效,尤其适合资源有限的硬件环境。Core 单线程版本在 X64/WebAssembly 平台不到 600 KB,裁剪后可低至 300 KB
完整文档站点:https://doc.leanclr.com
仓库内当前状态文档:
Standard 版本目前已支持以下平台:
| 平台 | 说明 |
|---|---|
| Windows | Win64 等桌面目标 |
| Linux | 桌面与嵌入式 Linux |
| macOS | 桌面目标 |
| Android | 移动端 |
| iOS | 移动端 |
| HarmonyOS(鸿蒙) | 鸿蒙生态 |
| WebAssembly | Web 浏览器及小游戏平台 |
LeanCLR 已支持 Unity 引擎与 .NET 10 BCL,正在接入 Godot,并将持续扩展更多引擎和平台。
| 平台 / 集成 | 状态 | 说明 |
|---|---|---|
| Unity 及团结引擎 WebGL 和小游戏平台 | ✅ 完成 | leanclr-unity 是 LeanCLR 的 Unity 插件,发布游戏(不限于 WebGL/小游戏平台)时替换 IL2CPP 为 LeanCLR |
| CoreCLR .NET 10 BCL | ✅ 基础完成 | coreclr 分支已能加载并运行 .NET 10(net10.0)纯逻辑程序集,覆盖核心 BCL;部分不常用底层调用与库仍在完善,详见 .NET 10 支持 |
| Godot 全平台 | 🚧 开发中 | leanclr-godot 正在接入 Godot 引擎 |
| Unreal Engine 全平台 | 📋 规划中 | 发布时间待定 |
| 模块 | 状态 | 说明 |
|---|---|---|
| 元数据解析 | ✅ 完成 | 完整支持 PE/COFF 格式和 CLI 元数据表 |
| 类型系统 | ✅ 完成 | 类、接口、泛型、数组、值类型等 |
| IR 解释器 | ✅ 完成 | 热点函数优化执行 |
| 异常处理 | ✅ 完成 | try/catch/finally、嵌套异常等 |
| 反射 | ✅ 完成 | Type、MethodInfo、FieldInfo 等核心 API |
| 委托 | ✅ 完成 | 单播/多播委托、泛型委托 |
| 内部调用 | ✅ 完成 | 当前以 Core 版本 icall 为主 |
| P/Invoke | ✅ 完成 | 支持手动注册及使用LeanAOT自动生成P/Invoke包装函数 |
| 垃圾回收 | ✅ 完成 | 准确式 Mark-Sweep 全量 GC |
| AOT 编译器 | ✅ 完成 | 已支持 IL → C++ 转译 |
当前 Standard 版本稳定性较高:
- unity 分支:与 Unity 2019.4.x – 6000.3.x LTS IL2CPP 的 BCL 完全兼容,通过全部(数千个)测试用例
- mono 分支:与 Mono 4.8 的 BCL 99.95% 兼容,仅一个测试用例失败
- coreclr 分支:已支持 .NET 10(
net10.0)BCL 并可稳定运行纯逻辑程序集,原有运行时测试资产已在 .NET 10 下全量回归通过;部分不常用底层调用与库仍在持续完善
coreclr 分支已能加载 net10.0 程序集并在 System.Private.CoreLib 世界下通过解释器执行,覆盖游戏与工具项目最常用的核心 BCL 能力:
- 基础对象模型、字符串、数组、值类型、枚举、装箱/拆箱
- 泛型、异常、委托,以及
isinst/castclass等核心 IL 语义 - 反射、自定义特性读取、
RuntimeType/RuntimeHandle句柄 Span<T>/Unsafe/RuntimeHelpers、RVA 数据、内联数组- 单线程同步原语(
Monitor/lock/ 受控的Task续延) - 基础
System.IO(文件、路径,带跨平台回退) - 受限的
AssemblyLoadContext/Reflection.Emit(轻量 lambda、动态程序集元数据) - 基于反射的序列化(已用真实的 OdinSerializer 序列化/反序列化往返验证)
当前目标是运行受控的、纯逻辑的 net10.0 程序集,而非托管完整的 Microsoft.NETCore.App。以下不常用调用与底层库尚未支持,触发时会输出明确的诊断信息而非静默失败:
- 完整的
Microsoft.NETCore.App(仅按需提供白名单内的 BCL 子集) - 多线程运行时:
ThreadPool、Timer、后台工作线程、跨线程Monitor、复杂WaitHandle - 网络 / 套接字 / HTTP 等平台 IO,以及文件监视、ACL、重叠 I/O 等高级 IO
- 动态原生代码生成:完整的
Reflection.EmitIL 发射、DynamicMethod原生 codegen - 完整 CoreCLR
AssemblyLoadContext(可回收 / 卸载)以及调试器协议 - COM 互操作与复杂 marshaling
当前 LeanCLR 按单线程 runtime 约束描述;async/await 通过单线程帧调度器或宿主分发器表达。完整多线程 runtime 不属于当前支持面。
NKGGameFramework 提供了一个运行在 LeanCLR .NET 10 上的真实工程级完整测试套件,覆盖框架核心逻辑、反射、特性枚举、序列化(OdinSerializer)与异步(UniTask)等场景,可作为 .NET 10 支持范围的参考基线。
LeanCLR 提供 Standard 与 Core 两个版本:Core 自 Standard 裁剪而来。两者当前均按单线程 runtime 约束发布,完整多线程 runtime 不属于当前支持面。详见 Core 与 Standard。
Core 版本已经实现,可运行于所有支持 C++11 的平台。Core 适合作为嵌入式的纯脚本引擎:既可以直接纯解释执行,也可以配合 LeanAOT 将热点 IL 转译为 C++,获得良好的运行性能。
Standard 版本按 BCL 来源分为三个分支:
| 分支 | BCL 来源 | 说明 |
|---|---|---|
| mono | Mono BCL | 通用跨平台集成,兼容 Mono 4.8 BCL |
| unity | Unity IL2CPP BCL | 面向 Unity / 团结引擎集成 |
| coreclr | CoreCLR BCL | 已支持 .NET 10(net10.0)BCL,可运行纯逻辑程序集 |
| 特性 | Standard | Core |
|---|---|---|
| ECMA-335 | 标准实现,高兼容 | 标准 ECMA-335 规范实现 |
| 线程模型 | 单线程 | 单线程 |
| 跨平台 | Win、Linux、macOS、Android、iOS、HarmonyOS、WebAssembly 等 | 全平台,纯 C++11,无平台相关依赖 |
| BCL | mono / unity / coreclr 分支,平台相关 icall 部分实现 | mono-4.5 BCL,仅实现其中部分平台相关调用 |
| GC | 准确式 Mark-Sweep 全量 GC | 准确式 Mark-Sweep 全量 GC |
leanclr-demo 提供两个平台的示例用于快速体验 LeanCLR 的功能:
| 示例 | 说明 |
|---|---|
| win64 | Windows x64 平台示例,运行 run.bat 即可执行 |
| h5 | WebAssembly 浏览器示例,通过 HTTP 服务器访问 index.html |
leanclr-unity-demo项目展示如何使用leanclr-unity插件,在发布WebGL/小游戏/Win64目标平台时替换il2cpp为leanclr运行时。
| 仓库 | 说明 |
|---|---|
| leanclr-unity | leanclr-unity 是 LeanCLR 的 Unity 插件,发布 WebGL / 小游戏平台时替换 IL2CPP 为 LeanCLR,大幅缩减包体、降低内存占用 |
| leanclr-godot | LeanCLR Godot 插件(开发中) |
| hybridclr | HybridCLR:特性完整、零成本、高性能、低内存的 Unity 全平台原生 C# 热更新方案 |
- 邮箱:leanclr#code-philosophy.com
- Discord 频道:https://discord.gg/esAYcM6RDQ
- QQ 群:1047250380