C# 是编程语言, 它能够编译为一种中间语言: CIL(Common Intermediate Language), 也被称为 IL(Intermediate Language).
不止 C# 能够编译为 CIL , 一些其他的语言也可以, 例如: F#、VB.NET 之类的.
CIL 程序需要由一个 .NET Runtime 来运行:
- 微软一开始提供了仅支持 Windows 的 .NET Framework (2002年);
- .NET Framework 推出后, 一家名为 Ximian 的公司开始提供一款名为 Mono (2004年) 的 .NET Runtime , 它是开源的, 并且可以跨平台运行;
- Mono 的发展不是那么顺利, 好在微软也开始着手开发跨平台 .NET Runtime , 即 .NET Core (2016年), 顺手把还在维护 Mono 的 Xamarin 公司收购了.
- 当下, 微软已经把 .NET Framework / .NET Core / Mono 全部收入囊中, 并整合进名为 .NET 的新 .NET Runtime 中了, 虽然名字不同, 但是版本是延续了 .NET Framework 的, 即从 .NET Framework 4.8 (与 .Net Core 3.1 )之后, 就变成了整合版的 .NET 5 , 不得不说微软起名字真的是让人头大.
.NET Runtime 可以看做一种能够运行 CIL 程序的更基础的程序, 它能将硬件平台的复杂性与程序隔离开, 使得一份 CIL 程序可以在多个不同的硬件上运行, 而不是针对每个硬件单独编译一次.
Mono 提供了跨平台的支持, 使得 CIL 得以运行在非 Windows 的设备上, 所以在 Unity 创立之初(2004年)选择了 Mono 作为 C# 的运行时而不是 .NET Framework .
.NET Runtime 因为有多个实现, 所以在它之上其实还有一套标准在约束着它们, 即 .NET Standard . .NET Standard 是一套 API 的集合, 任何 .NET Runtime 都要提供这些 API 的实现.
.Net 的发展非常快, 在很多地方已经优于 Mono , Unity 已经打算抛弃 Mono 了, 在当下(2024年)这个节点, Unity 可能很快就会发布基于 .NET 5+ 的游戏引擎.
C# 的版本决定了 C# 能够提供哪些语言特性, 不过具体是否能够提供取决于 .NET Runtime 的支持, Unity 受限于 Mono, 经常只提供部分的新特性支持.
Unity 其实也搞了一个名为 IL2Cpp(Intermediate Language To C++) 的编译工具, 由于 C# 编译后的 CIL 运行在 .NET Runtime 中, 性能与安全性不如C++ , 所以 Unity 将 CIL 进一步转化为 C++ 代码, 再转化为硬件支持的机器语言程序, 使得性能与安全性进一步提升.
在编辑器模式下 Unity 会采用 Mono 作为后端, 以 JIT(Just-In-Time) 模式运行, 以便快速预览修改, 这也是为什么你修改代码后, 能那么快就在编辑器中运行起 Unity 的原因.
在构建成可执行程序时, 则使用 AOT(Ahead-Of-Time) 模式, 即提前将所有代码编译好, 以可以避免运行时损耗. Mono 支持 AOT 模式, 但是一般会使用 IL2Cpp 来生成性能更好的 C++ 代码.