问题描述
使用 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 系统中发现 .dll
,Golboth’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
文件的两种情况如下:
-
供 .NET/Mono 应用程序使用的共享库。Golboth’s answer 对此进行了详细描述。这是您在 Ubuntu 系统上看到的大多数
.dll
的用途。只是它恰好不是GameDataFolder/Managed
文件夹中的.dll
文件的用途。 -
提供代码的文件,由嵌入式 Mono 运行时使用,为本机代码应用程序提供 “scripting”。That’s what’ 在本例中正在发生。
在另外两种相当常见的情况下,您可能会在 Ubuntu 上看到 .dll
文件:
-
.NET Core 的编译器会生成
.dll
文件,而不是.exe
文件,即使您编译的不是库。.NET Core 运行时(称为 CoreCLR),而不是常规的 .NET Framework 或 Mono,会运行这些文件。.NET Core 是 Microsoft 产品,但与标准 .NET Framework、适用于 GNU/Linux 系统(如 Ubuntu)的 .NET Core is cross-platform 和 official support 以及 it is free open source software 不同。 -
有时,您在 Ubuntu 上看到的
.dll
文件只是一个 Windows 库。如果程序存储在 Ubuntu 系统中但在 Windows 上运行,或者您在 Ubuntu 中安装了 Windows 驱动器,您可能会看到这种情况。您还可能会在能够使用 Wine 在 Ubuntu 上运行的程序中看到它,包括 Wine 附带的软件或您使用winetricks
自动安装以支持其他 Windows 软件的软件。
这并不是试图详尽列出在 Ubuntu 上可能遇到 .dll
的所有情况。(例如,它也可能是 an OS/2 library。)但是,我认为这四种情况是最常见的。