---
title: "Unity、Mono、IL2CPP 与 .NET 的关系"
author: "Perrin Yong"
author_profile: https://www.pystone.net/profile/
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/unity-mono-il2cpp-dotnet-relationship/
type: note
content_role: unspecified
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/05-游戏图形与运行时/Unity/Unity、Mono与.NET的关系.md"
content_hash: 11d6d41f82cb7ae9807bbc5e34a152db04a26e39bcccfb209df32d5b1a294695
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# 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 后端

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

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

### IL2CPP 后端

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

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

## 三张历史示意图

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

![早期 .NET 编译运行示意](/media/923654293893a7cf78a3.png)

![Unity 与 Mono 的历史关系示意](/media/de4dba67a1bf3a63a36b.png)

![CLI 与运行时历史示意](/media/bad4735cbcdbbba89933.png)

## 实践中的判断顺序

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

## 参考资料

- [Unity Manual：Scripting backends](https://docs.unity3d.com/ja/current/Manual/scripting-backends-intro.html)
- [Unity Manual：IL2CPP overview](https://docs.unity3d.com/cn/6000.0/Manual/scripting-backends-il2cpp.html)
- [Unity Manual：Managed memory introduction](https://docs.unity3d.com/jp/current/Manual/performance-managed-memory-introduction.html)
