返回「计算机、信息技术与工程」

Unity、Mono、IL2CPP 与 .NET 的关系

更多
Markdown 结构化数据
本文目录 7 个章节

Unity、Mono、IL2CPP 与 .NET 的关系

note · 更新说明 原笔记把 Unity 简化成“由 Mono 提供 C# 运行环境”。这对部分历史版本成立,但现代 Unity 还可使用 IL2CPP;可用的 .NET API 兼容级别也不等同于直接运行桌面 .NET SDK。

先区分四个概念

  • C#:编程语言。
  • .NET 标准库/API 兼容级别:代码可调用的一组类型和接口约定。
  • Mono:开源 .NET 运行时实现之一。Unity 的 Mono 脚本后端通常把 C# 编译为 CIL,再由运行时执行,并提供垃圾回收等能力。
  • IL2CPP:Unity 的 AOT 脚本后端,把托管程序集中的 CIL 转换为 C++,再由目标平台原生编译器生成二进制;运行时仍需要 Unity 提供的托管语义、GC 与互操作支持。

编译与运行路径

Mono 后端

C# 源码 → C# 编译器 → CIL 程序集 → Mono/Unity 运行时执行

Mono 后端通常便于快速迭代和调试,但具体 JIT/AOT 能力受目标平台限制。

IL2CPP 后端

C# 源码 → CIL 程序集 → IL2CPP 转换为 C++ → 平台编译器 → 原生程序

IL2CPP 不是把任意 C# 语句直接“翻译成等价手写 C++”,而是 Unity 的构建链和运行时实现方案。AOT 环境会影响反射、泛型实例化、动态代码生成与代码裁剪,需要按 Unity 文档配置。

三张历史示意图

以下图片来自原笔记,用于理解早期 .NET/Mono 关系;其中版本与产品边界可能已过时。

早期 .NET 编译运行示意

Unity 与 Mono 的历史关系示意

CLI 与运行时历史示意

实践中的判断顺序

  1. 确认 Unity 版本、目标平台和当前脚本后端。
  2. 确认 API Compatibility Level,而不是只看本机安装了哪个 .NET SDK。
  3. 检查第三方程序集是否支持 AOT、代码裁剪与目标 CPU 架构。
  4. 遇到内存问题时区分托管对象、Unity Native Object、原生插件和系统/驱动分配。
  5. 发布前分别在 Editor、Development Build 与真实发布构建验证,不能只依赖编辑器行为。

参考资料