Mono与.NET在Unity中的区别

10

我使用Unity和Visual Studio,非常好用。但是我对.NET、Mono和Unity之间的关系感到困惑,请问以下陈述哪些是正确的?

  1. .NET Framework不是为跨平台而设计的。
  2. .NET Framework的目标是以统一的方式设计程序,并且它们必须在虚拟机中运行。
  3. Mono是.NET Framework的开源版本,旨在实现跨平台。使用它构建的程序可以在安装了Mono虚拟机的任何地方运行。
  4. 使用Mono构建的程序不能运行或与.NET虚拟机不完全兼容。
  5. Unity仅在编辑、构建和运行游戏时使用Mono。
  6. 使用Unity构建的游戏包含嵌入其中的Mono框架和/或虚拟机。
  7. 我不需要安装.NET Framework来构建或运行Unity游戏。
  8. 我在Unity中编写的C#脚本由Mono虚拟机在构建前后运行。所有Unity引擎公共代码库都是通过C++封装的,实际上并非C#,因此它在一个C++引擎中运行。
  9. Mono框架工具和库会在游戏中使用Mono虚拟机运行。
  10. 使用.NET Framework构建的DLL与Mono不完全兼容。

4和10是错误的,您可以使用mono执行.net可执行文件,反之亦然,它们完全兼容,但是mono框架可能缺少一些.net具有的功能,同样也存在相反的情况,但通常这些是OS特定函数或与UI相关的事物,但兼容性为100%,如果您在其中一个提供了缺失的功能,那么它们将完美地工作。 - Gusman
1
FYI - 还有一个名为 .NET Core 的“新”平台,它是跨平台的,同时也可以使用 .NET Standard 制作可在几乎整个 .NET 生态系统中使用的便携式库。 - NightOwl888
1个回答

20
.Net框架并非为跨平台设计。这取决于您是否希望包括Linux在内。如果您想知道.NET最初是否设计为针对Linux,则答案是否定的。但是,有.NET Compact Framework,它允许.NET代码在Xbox 360和Windows Phone上运行。现在有.NET Core,这是一个免费且开源的框架,专为跨平台设计,特别是Windows、Mac和Linux。
是的,.Net框架的目标是以统一的方式设计程序,并且它们必须在执行引擎中运行。正确的术语是“Execution Engine”,而不是VM,尽管它们都属于同一类。不要将EE视为vmWare之类的东西,其中CPU指令被不断地模拟。像Java一样,.NET是一种p-code形式,但.NET程序集会JIT到当前CPU上,以提高性能并在CPU上本地运行。[1]
Mono是一个开源的.NET Framework版本,旨在跨平台使用。使用它构建的程序可以在任何有Mono虚拟机的地方运行。 是的,.NET Core也有同样的功能。
使用Mono Framework构建的程序不能在.NET虚拟机上运行,或者与之不完全兼容。
Mono Framework的许多版本并不是等效的.NET Framework。
例如:
- Mono在.NET 3.0中不支持WPF。 - Mono在.NET 3.0中不支持WWF。 - Mono在.NET 4.0中不支持CodeContracts。
Unity不仅使用Mono Framework,在编辑、构建和运行游戏时还使用Unity Script。

无论您选择哪种语言,运行时都存在很大的差异。例如,当通过Unity Web Player针对Web浏览器进行定位时,不存在.NET/Mono EE。平台是Unity Web Player。从这个意义上说,在目标平台上不需要.NET/Mono。[3]

  1. 使用Unity构建的游戏具有嵌入式mono框架和/或mono虚拟机。

不正确,请参见上文

  1. 我不需要为构建或运行Unity游戏而安装.Net Framework。

正确

  1. 我在Unity中编写的C#脚本在构建前后都由mono虚拟机运行。所有Unity引擎公共代码库都是C++封装的,实际上并不是C#,因此它们在C++引擎端运行。

不正确,您选择使用哪种语言来编写Unity游戏与运行时是否存在.NET/Mono EE之间没有关联。

  1. mono框架工具和库在游戏中使用mono虚拟机运行。

这要看情况。

  • 在您的桌面上运行Unity编辑器时?- 是的
  • 部署在智能设备/浏览器上运行?- 不是
  1. 使用.Net Framework构建的Dll与Mono不完全兼容。

不正确。实际上,可能是Mono与等效的.NET Framework不完全兼容。[2]

另请参阅

1 "CLR是虚拟机吗?", MSDN

2 兼容性, Mono

3 Unity Web Player如何工作?, Quora

4 .NET Core Framework - 使用 .NET Framework 跨平台,MSDN


我在我的程序文件中没有找到任何Mono文件夹,这是否意味着Mono SDK(我们从www.mono-project.com/download/下载的东西)未安装在我的计算机上? 游戏引擎Godot需要它进行C#脚本编写,那么Unity是如何在没有它的情况下工作的?它全部嵌入了吗? - bsmall
@bsmall 我怀疑 Mono 安装在 Unity 文件夹中,因为它只能与某些版本的 Mono 兼容。例如,直到最近 Unity 才支持等效于 .NET4 的版本。 - user585968
@MickyD 我正在尝试编写一个跨平台的数据密集型桌面应用程序,你有什么推荐吗? - Stephane
@Stephane 在 Stack Overflow 上提出一个新问题。 - user585968
回复:#8 -- 技术上Unity有IL2CPP选项,在编译时将IL代码转换为原始C++(而不是在运行时使用JIT)。 - BrainSlugs83

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接