作为一个简单的 Unity 独立开发者,Mono 和 .NET 仍然让我感到困惑。谁是谁 ?谁做了啥?

Posted

技术标签:

【中文标题】作为一个简单的 Unity 独立开发者,Mono 和 .NET 仍然让我感到困惑。谁是谁 ?谁做了啥?【英文标题】:As a simple Unity indie dev, Mono and .NET still confuse me. Who is who ? Who does what?作为一个简单的 Unity 独立开发者,Mono 和 .NET 仍然让我感到困惑。谁是谁 ?谁做了什么? 【发布时间】:2018-07-14 20:12:39 【问题描述】:

我将 Unity 与 Visual Studio 一起使用,它非常棒。但是,我对 .NET、Mono 和 Unity 究竟是如何相互关联的感到困惑。我在该领域没有专业经验,我需要一些澄清。这些说法是对还是错?

    .NET 框架不是为跨平台而设计的。 .NET frameWork 的目标是以统一的方式设计程序,并且它们都必须在虚拟机中运行。 Mono 是 .NET 框架的开源版本,旨在跨平台。用它构建的程序可以在任何有单声道虚拟机的地方运行。 使用 mono 框架构建的程序无法运行或与 .NET 虚拟机不完全兼容。 Unity 仅在编辑、构建和运行游戏时使用 Mono 框架。 使用 Unity 构建的游戏具有嵌入式单声道框架和/或单声道虚拟机。 我不需要 .Net 框架来构建或运行 Unity 游戏。 我在 Unity 中编写的 C# 脚本在构建时间前后由单声道虚拟机运行。 所有 Unity 引擎公共代码库都是 C++ 包装的,实际上不是 C#,因此它们在 C++ 端引擎上运行。 单声道框架工具和库在游戏中使用单声道虚拟机运行。 使用 .NET 框架构建的 DLL 与 Mono 不完全兼容。

那么我的评分是多少?我哪里错了? (请客气。英语不是我的母语)。

【问题讨论】:

4 和 10 为 false,您可以使用 .net 可执行文件并使用 mono 运行它,反之亦然,它们完全兼容,但 mono 框架可能缺少 .net 具有的某些功能并且在另一种方式,但通常那些是或操作系统与 UI 相关但兼容的特定功能或事物是 100%,如果您在其中一个或另一个中提供缺少的功能,那么这些功能将完全正常。 仅供参考 - 还有一个名为 .NET Core 的“新”平台,它跨平台的,还可以使用 .NET Standard 制作可移植库,可以在几乎整个 .NET 生态系统中使用。 【参考方案1】:
    .Net frameWork 不是为跨平台设计的。

取决于您是否希望在其中包括说 Linux。如果您问.NET 是否最初是为 Linux 设计的,那么,不是。但是有 .NET Compact Framework,它允许 .NET 代码运行 Xbox 360 和 Windows Phone。

现在有 .NET Core,这是一个免费的开源框架,专为跨平台,特别是 Windows、Mac 和 Linux 而设计。

    .Net 框架的目标是以统一的方式设计程序,并且它们都必须运行和虚拟机。

是的。正确的术语是 Execution Engine 不是 VM,尽管它们都属于同一个类。不要将 EE 视为类似于 vmWare 的东西,其中 CPU 指令被不断模拟。 .NET 与 Java 类似,是一种 p 代码形式,但 .NET 程序集对当前 CPU 进行 JIT 处理,以提高性能并在 CPU 上本地运行。 [1]

    Mono 是.Net frameWork 的开源版本,设计为跨平台。用它构建的程序可以在任何有单声道虚拟机的地方运行。

是的。 .NET Core 也有同样的主张。 [4]

    使用 mono frameWork 构建的程序无法运行,或者与 .Net 虚拟机不完全兼容。

跨多个版本的 Mono 框架不是等效 .NET 框架的 1:1。

例如

Mono 在 .NET 3.0 中不支持 WPF [2] Mono 在 .NET 3.0 中不支持 WWF [2] Mono 不支持 .NET 4.0 中的 CodeContracts [2]
    Unity 仅在编辑、构建和运行游戏时使用 Mono 框架。

不正确。 Unity 还使用 Unity 脚本编写游戏。

但是,无论您选择哪种语言,运行时都有很大的不同。当通过 Unity Web Player 定位网络浏览器时,没有 .NET/Mono EE。该平台是 Unity Web Player。从这个意义上说,目标平台不需要 .NET/Mono。 [3]

    使用 Unity 构建的游戏已嵌入单声道框架和/或单声道虚拟机。

不正确,见上

    我不需要 .Net 框架来构建或运行 Unity 游戏。

正确

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

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

    单声道框架工具和库在游戏中使用单声道虚拟机运行。

视情况而定。

在您的桌面上运行 Unity 编辑器? - 是的 部署在智能设备/浏览器上运行? - 没有
    使用 .Net 框架构建的 Dll 与单声道不完全兼容。

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

另见

1 "Is the CLR a Virtual Machine?",MSDN

2 Compatibility,单声道

3 How does the Unity Web Player work?,知乎

4 .NET Core Framework - Go Cross-Platform with the .NET Framework,MSDN

【讨论】:

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

以上是关于作为一个简单的 Unity 独立开发者,Mono 和 .NET 仍然让我感到困惑。谁是谁 ?谁做了啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 Unity3D 的 Mono 虚拟机中嵌入 Lua 的一个方案(转载)

用Unity开发时,IDE是用Vs好还是Mono好

使用 Mono.Cecil 辅助 Unity3D 手游进行性能测试(续)

Visual Studio和Unity Mono注册了clobbering

为啥Mono问题,怎么解决

Unity3D学习:简单梳理下Unity跨平台的机制原理