【游戏引擎 - C#脚本系统】1、Mono介绍

翻译 from peter1745的《mono-guide》
强烈建议阅读Mono官方文档

1、About Mono

1.1 Mono是什么


我假设您已经知道 Mono 是什么,因为您决定查看本指南,但为了以防万一,我将给出一个简短的解释。

简而言之:Mono 是 Microsoft [.NET Framework] 的一个开源实现。它最初的设计目的是为了将 .NET 语言(主要是 C#)引入 Windows 以外的平台。

如今,它对于跨平台支持并不是绝对必要的,因为 Microsoft 一直致力于使 .NET 本身就可以跨平台。但 Mono 对于引擎脚本系统仍然非常有用,因为与 .NET Core 或 .NET Framework 不同,它提供了一个不错的 C/C++ API 来嵌入 .NET runtime。

1.2 Mono的多个版本


现在,Mono 实际上有“两个”版本,其中一个被我称为 Classic Mono,这也是我们将在这里介绍的主要内容,另一个被我称为 .NET Core Mono 。我不会深入讨论 .NET Core 和 .NET Framework 之间的差异,但最大的区别是经典 Mono 最多仅支持 C# 7 或 .NET Framework 4.7.2,而 .NET Core Mono 支持最新版本C#,并作为 .NET Runtime 项目的一部分进行开发。

Mono 的两个版本均由 Microsoft 开发,但 Classic Mono 并未集成到 .NET 中,而 .NET Core Mono 则“集成”到了 .NET 中。我最终还将介绍如何构建 Mono 的 .NET Core 版本,但我将首先介绍classic Mono,因为它更简单,并且更适合游戏引擎(稍后我将解释原因)。

1.3 为什么游戏引擎中,不使用.Net Core 版本的mono?


简而言之:它不支持重新加载程序集(assemly)。如果您不知道 C# 程序集是什么,我建议您仔细阅读一下它们,但它们本质上是一个 DLL 文件,其中包含所有代码,转换为中间语言(通常称为“IL”或“字节码”)。

那么为什么程序集重新加载在这种情况下很重要呢?因为当其他人编写 C# 脚本时,您希望对代码所做的更改立即在引擎(或编辑器)中生效,而无需重新启动整个编辑器/游戏。为此,我们首先必须卸载旧程序集,然后加载新程序集,而无需重新启动程序。

2、Windows平台上构建 Mono

2.1 从Github上克隆


链接:https://github.com/mono/mono
命令:git clone https://github.com/mono/mono

2.2 从源码构建经典版本的Mono


Mono 是一个相当大的项目,因此构建 Mono 可能需要一些时间

在 Windows 上构建 Mono 非常简单,很可能比任何其他平台都容易。我要提醒的是,使用 Visual Studio 仅适用于构建 Mono 运行时库不适用于 .NET 库(例如 System.dll、System.Collections.Generic.dll 等…)。

就我而言,我不会从源代码构建 .NET 库,我将通过在本地安装 Mono 并从安装目录复制它们来获取它们

如果您想构建 .NET 库,您需要通过 make 命令,您可以通过运行 Cygwin shell 来使用该命令。

需要:

  • 已安装的 Mono 副本(可能不是必需的,但最好有以防万一)
  • Visual Studio(我将使用VS2022)—— 用于构建mono库
  • Cygwin 或其他一些可以让您使用 make 的工具(仅当您想要构建 .NET 库时才需要,如果是本地安装的则不需要

为了构建 Mono,您只需导航到 mono/msvc/ 并在 Visual Studio 中打开 mono.sln

您现在需要做的就是选择构建配置(Debug/Release)和构建平台(x64/x86)。

我建议同时构建 ReleaseDebug 配置,因为仅构建 Release 将意味着调试 Mono 相关问题会更加困难。对于本指南而言,您想要构建 64 位还是 32 位并不重要,但现在这个时代确实不太需要支持 32 位平台。

开始构建并让它运行!

如果您已正确完成所有操作(我假设您已正确完成,因为在 Windows 上构建 Mono 并不困难),您可以继续阅读“3、获取必要的文件”一章。

3、获取必要的文件

现在是时候获取嵌入 Mono 运行时所需的所有必要文件了。这包括 Mono 库和 .NET 库。我将提供在windows上所需要的这些文件和位置。

3.1 本地库


所有 Mono 的本地库都被构建到 mono-root/msvc/build/sgen/{platform}/ 中,其中 {platform}x64Win32

在该文件夹中,您将看到另外三个文件夹,分别为 binlibobj,我们只对 binlib 文件夹感兴趣。根据您是否同时构建了 ReleaseDebug,或者仅构建了 Release 或仅构建了 Debug,这两个文件夹都将具有一个或两个子文件夹。

我只会告诉您需要哪些文件,如何选择构建项目依赖项取决于您。

因此,这是您需要从lib获取的库:

  • eglib.lib
  • libgcmonosgen.lib
  • libmini-sgen.lib
  • libmonoruntime-sgen.lib
  • libmono-static-sgen.lib
  • libmonoutils.lib
  • mono-2.0-sgen.lib
  • MonoPosixHelper.lib

您还需要 bin 文件夹中的一些文件,这些文件必须放置在您的应用程序可执行文件旁边

  • mono-2.0-sgen.dll
  • MonoPosixHelper.dll

3.2 .Net 库(通过本地安装或源码自己构建)


从技术上讲,您不必将 .NET 库复制到您自己的程序中,您可以告诉 Mono runtime 他们的位置,但我喜欢让它们成为项目的一部分,所以我将复制它们。我不会提供您需要的文件的完整列表,这些文件有很多,相反,我只会告诉您需要复制哪些文件夹。

如果您在本地安装了 Mono(不仅仅是克隆它),您必须导航到安装它的文件夹,在我的例子中,我将其安装到 C:\Program Files\Mono。在该安装文件夹中,您需要导航到 lib/mono,并且您应该看到一堆带有数字的文件夹,其中一些带有 -api 后缀。

您可能需要的主文件夹是 4.5,只需确保将其复制到你的程序的 lib 文件夹中,该文件夹位于名为 mono 的文件夹内。就我而言,它是 D:\dev\MyGameEngine\MyEditor\mono\lib。我可能会在以后覆盖其他文件夹,但我最近才开始自己尝试它们,所以我不想在这里提供不正确的信息。

如果您从源代码构建 .NET 库,则必须导航到 mono-root/mcs/class/corlib,并且应该在那里找到相同的文件夹。我自己没有这样做,所以我可能是不正确的,如果是这样,请在本页面的 GitHub 提出一个issue。位于https://github.com/peter1745/peter1745.github.io.

3.3 头文件


获取正确的头文件非常容易,它们位于 mono-root/msvc/include/ 中。您可能需要复制 mono 文件夹,以便在包含 Mono 头文件时键入 #include <mono/somedir/somefile.h>

到此!您现在已经获得了引入 Mono runtime 所需的所有文件。

在我们继续之前,我想说大多数时候您只需要链接到 mono-2.0-sgen.lib,但您仍然应该保留其他 .lib 文件,以备以后需要它们,或者您也可以删除(如果您想尽可能缩小项目的大小)。

千万记住,至少将 mono-2.0-sgen.dll 复制到与应用程序可执行文件相同的文件夹中。

  • 12
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宗浩多捞

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值