Linux程序中的.dll在做什么?


20

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

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

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

为什么?

Answers:


25

您正在谈论的游戏基于.NET Framework并与Mono一起运行,Mono是Microsoft .NET Framework的免费开源实现。

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

设计用于跨平台使用的.NET程序可以在Windows,Linux或Mac上以相同的“二进制文件”(包括也是程序集的DLL)运行,这些程序在MSIL中进行编译,需要执行.NET / Mono运行时。

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


11
还要注意,这些dll不是“真正的” Windows dll,而是实际编译的.NET字节码。
Sanya_Zol's

5
另请注意,文件扩展名(包括.dll和).so在Linux中没有意义。它们只是为了我们的方便而使用。
code_dredd

1
@ray你能解释一下吗?我认为它们仍然是传达文件类型信息的标准,因此不是没有意义吗?
FMaz

2
@FynnMazurkiewicz:更多的是设计传统的问题,而不是两个系统都强制执行的单个中央属性。实际上,无论 Windows内核 Linux动态链接器都将以其各自的格式愉快地加载共享库(无论其文件名以.dll还是.so或其他名称结尾)。出于历史原因,Windows中的LoadLibrary系统调用在某些情况下会在文件名后附加“ .dll”(如果它没有扩展名),但这不是通常使用的扩展名。
Henning Makholm

1
@ray不大:gcc不会找到像如提供的库-lm如果文件名不是结束.so.a或版本控制的变体。
Ruslan

9

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

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

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

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

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

Unity游戏引擎如何使用Mono

Unity游戏引擎主要使用C ++编写,它拥有自己的Mono实例,该实例不使用(也可能与通过系统的程序包管理器安装的版本(如果有)不同)。此嵌入式Mono运行时不能用于运行独立的.NET / Mono程序,因为这不是其目的。相反,引擎的本机代码部分使用它来运行CIL代码。(CIL是Common Intermediate Language,这是它的正式名称。自从Microsoft最初开发它以来,以前称为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系统上看到的大多数内容。只是碰巧不是.dll文件GameDataFolder/Managed夹中文件的用途。
  2. 一个提供代码的文件,嵌入式Mono运行时使用该文件为本地代码应用程序提供“脚本”。这就是这种情况。

在其他两种合理的常见情况下,您可能会.dll在Ubuntu上看到文件:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.