.dll 在 Linux 程序中做什么?

xuw*_*wer 20 mono dynamic-linking unity3d

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

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

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

为什么?

Gol*_*oth 25

您所说的游戏基于 .NET Framework 并使用 Mono 运行,Mono 是 Microsoft .NET Framework 的免费开源实现。

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

一个为跨平台使用而设计的 .NET 程序可以在 Windows、Linux 或 Mac 上运行,具有相同的“二进制文件”(包括也是程序集的 DLL),它们在 MSIL 中编译,需要 .NET/Mono 运行时才能执行.

请注意,您还有一些基于 Ubuntu 存储库中可用的 Mono 框架的免费应用程序(不仅仅是游戏)。例如:假小子。

  • 另请注意,这些 dll 不是“真正的”Windows dll,而是实际编译的 .NET 字节码。 (11认同)
  • 还要注意文件扩展名,包括`.dll` 和`.so`,在Linux 中是没有意义的。它们只是为了我们的方便而使用。 (5认同)
  • @FynnMazurkiewicz:与其说是系统强制执行的单一中心属性,不如说是设计传统略有不同的问题。事实上,_both_Windows 内核_和_Linux 动态链接器将愉快地加载共享库(以它们各自的格式),无论其_filename_ 以 .dll 或 .so 结尾还是其他内容。由于历史原因,Windows 中的 LoadLibrary 系统调用在某些情况下会在文件名后附加“.dll”(如果它没有扩展名),但这不是它通常_used_ 的方式。 (2认同)

Eli*_*gan 9

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

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

可以由 .NET 公共语言运行时或 Mono 运行的跨平台可执行文件和共享库通常分别以.exe.dll后缀命名,即使它们不是特定于 Windows 的。当您.dll在 GNU/Linux 系统(如 Ubuntu)或除 Windows 之外的任何操作系统的程序中找到文件时,通常就是这个原因。大多数情况下,您会.dll在 Ubuntu 系统中找到 a ,Golboth 的回答对此进行了解释。但这并不是这里发生的事情。

统一的游戏引擎-它不应该与混淆在大多数Ubuntu的发行版默认的图形界面--is流行的自主研发的跨平台游戏引擎。此引擎不在.NET Framework 或 Mono 之上运行。相反,它嵌入了 Mono,也就是说 Mono 在它之上运行。这就是开发人员编写他们的游戏需要的任何代码的方式,这些代码尚未包含在 Unity 引擎中。

通常,Mono 的使用方式与 Microsoft 的 .NET CLR 通常使用的方式相同,以运行完整的 .NET/Mono 程序。但 Mono 还被设计为可轻松嵌入本机代码应用程序中,包括使这些应用程序能够进行自定义。这就是你所描述的情况。您看到的文件不属于直接在 Mono 或 .NET CLR 之上运行的程序。相反,它们属于嵌入 Mono 的本机代码程序。

Unity 游戏引擎如何使用 Mono

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

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

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

.dll已经描述了您可能在 Ubuntu 上看到文件的两种情况:

  1. 供 .NET/Mono 应用程序使用的共享库。Golboth 的回答对此进行了详细描述。这是.dll您在 Ubuntu 系统上看到的大多数s。它恰好不是.dllGameDataFolder/Managed文件夹中的文件的用途。
  2. 提供代码的文件,嵌入式 Mono 运行时使用该文件为本机代码应用程序提供“脚本”。这就是在这种情况下发生的事情。

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

  1. .NET Core的编译器生成.dll文件而不是.exe文件,即使您正在编译的不是库。.NET Core 运行时(称为 CoreCLR)运行这些文件,而不是常规的 .NET Framework 或 Mono。.NET Core 是微软的产品,但与标准的 .NET Framework 不同,.NET Core 是跨平台的官方支持Ubuntu 等 GNU/Linux 系统,并且是免费的开源软件
  2. 有时.dll您在 Ubuntu 上看到的文件只是一个 Windows 库。如果程序存储在 Ubuntu 系统但在 Windows 上运行,或者如果您在 Ubuntu 中安装 Windows 驱动器,您可能会看到这一点。您可能还会看到它与能够使用Wine在 Ubuntu 上运行的程序有关,包括 Wine 附带的软件或您自动安装winetricks以支持其他 Windows 软件的软件。

这并不是要详尽列出您.dll在 Ubuntu 上可能遇到的所有情况。(例如,它也可以是 OS/2 库。)不过,我相信这四种情况是最常见的。