作为一个简单的 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 的一个方案(转载)
使用 Mono.Cecil 辅助 Unity3D 手游进行性能测试(续)