当前位置: 首页>>技术教程>>正文


mono – .dll 在 Linux 程序中起什么作用?

, ,

问题描述

使用 Linux 版 Unity3D 制作的游戏在其数据文件夹 GameDataFolder/Managed 中包含 .dll 文件。

这很奇怪,因为我认为 Linux 使用 .so 文件而不是 .dll 文件。

(Android-Unity3D 应用程序也是如此。)

为什么?

最佳答案

您所谈论的游戏基于 .NET Framework 并通过 Mono 运行,Mono 是 Microsoft .NET Framework 的免费开源实现。

由于这些应用程序是基于 .NET 的,因此程序集具有 .dll 扩展名。因此您可以在文件夹中看到 DLL 文件。

一个为 cross-platform 使用而设计的 .NET 程序可以在 Windows、Linux 或 Mac 上运行,相同的 “binaries”(包括也是程序集的 DLL)在 MSIL 中编译,需要 .NET/Mono 运行时才能执行。

请注意,Ubuntu 存储库中还有一些基于 Mono Framework 的免费应用程序(不仅仅是游戏)。例如:Tomboy。

次佳答案

GameDataFolder/Managed 中的 .dll 文件属于内部使用 Mono 的本机代码程序。

Unity 游戏引擎嵌入了 Mono(甚至在大多数 Windows 平台上)。

可由 .NET 公共语言运行时或 Mono 运行的 Cross-platform 可执行文件和共享库通常分别以 .exe.dll 后缀命名,即使它们并非特定于 Windows。当您在 GNU/Linux 系统(如 Ubuntu)或任何除 Windows 之外的操作系统的程序中找到 .dll 文件时,通常就是这个原因。大多数情况下,您会在 Ubuntu 系统中发现 .dllGolboth’s answer 可以解释这一点。但这并不是这里发生的情况。

Unity game engine(不要与 the default graphical interface in most Ubuntu releases 混淆)是一款流行的专有 cross-platform 游戏引擎。该引擎不在 .NET Framework 或 Mono 之上运行。相反,it embeds Mono (即 Mono 在其之上运行)在其之上运行。这就是开发人员编写游戏所需的任何代码的方式,这些代码还不是 Unity 引擎的一部分。

通常,Mono 的使用方式与 Microsoft 的 .NET CLR 通常使用的方式相同,即运行完整的 .NET/Mono 程序。但 Mono 也被设计为易于 embeddable in native code applications ,包括 to enable those applications to be customized 。That’s what’s 在您描述的情况下正在发生。您看到的文件不属于直接在 Mono 或 .NET CLR 上运行的程序。相反,它们属于嵌入 Mono 的 native-code 程序。

Unity 游戏引擎如何使用 Mono

Unity 游戏引擎主要用 C++ 编写,它拥有自己的 Mono 实例,该实例不使用(并且可能与)通过系统包管理器安装的版本(如果有)不同。此嵌入式 Mono 运行时不能用于运行独立的 .NET/Mono 程序,因为这不是它的用途。相反,引擎的本机代码部分使用它来运行 CIL 代码。(CIL 是 Common Intermediate Language ,这是它的官方名称。它以前被称为 MSIL 或 Microsoft 中间语言,因为它最初是由 Microsoft 开发的。)使用 Unity 引擎制作游戏的程序员通常用 C# 编写自己的代码,但也支持其他一些语言。

Unity 引擎甚至在 Windows 中嵌入了 Mono。对于 Universal Windows Platform 游戏(而不是其他平台),它使用 Microsoft .NET Framework 而不是 Mono。但大多数平台上的大多数 Unity 游戏(包括大多数移动设备和游戏机,包括 Ubuntu 和 Windows)都使用 Mono。在某些平台上,IL2CPP 可作为 Mono 的替代品,在少数平台上仅支持 IL2CPP。有关详细信息,请参阅 Scripting restrictions

在 Ubuntu 上可能看到 .dll 文件的其他情况

在 Ubuntu 上可能看到 .dll 文件的两种情况如下:

  1. 供 .NET/Mono 应用程序使用的共享库。Golboth’s answer 对此进行了详细描述。这是您在 Ubuntu 系统上看到的大多数 .dll 的用途。只是它恰好不是 GameDataFolder/Managed 文件夹中的 .dll 文件的用途。

  2. 提供代码的文件,由嵌入式 Mono 运行时使用,为本机代码应用程序提供 “scripting”。That’s what’ 在本例中正在发生。

在另外两种相当常见的情况下,您可能会在 Ubuntu 上看到 .dll 文件:

  1. .NET Core 的编译器会生成 .dll 文件,而不是 .exe 文件,即使您编译的不是库。.NET Core 运行时(称为 CoreCLR),而不是常规的 .NET Framework 或 Mono,会运行这些文件。.NET Core 是 Microsoft 产品,但与标准 .NET Framework、适用于 GNU/Linux 系统(如 Ubuntu)的 .NET Core is cross-platformofficial support 以及 it is free open source software 不同。

  2. 有时,您在 Ubuntu 上看到的 .dll 文件只是一个 Windows 库。如果程序存储在 Ubuntu 系统中但在 Windows 上运行,或者您在 Ubuntu 中安装了 Windows 驱动器,您可能会看到这种情况。您还可能会在能够使用 Wine 在 Ubuntu 上运行的程序中看到它,包括 Wine 附带的软件或您使用 winetricks 自动安装以支持其他 Windows 软件的软件。

这并不是试图详尽列出在 Ubuntu 上可能遇到 .dll 的所有情况。(例如,它也可能是 an OS/2 library。)但是,我认为这四种情况是最常见的。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/14629.html,未经允许,请勿转载。