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

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

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

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

为什么?

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

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

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

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

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

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

可以由.NET公共语言运行时或单声道运行的跨平台可执行文件和共享库通常分别以.exe.dll后缀命名,即使它们不是特定于Windows。 当你在像Ubuntu这样的GNU / Linux系统的程序中找到一个.dll文件,或者除了Windows之外的任何操作系统,这都是为什么。 大多数时候你在Ubuntu系统中找到.dll , Golboth的答案解释了它。 但这并不是这里发生的事情。

Unity游戏引擎 – 不应该与大多数Ubuntu版本中的默认图形界面混淆一种流行的专有跨平台游戏引擎。 此引擎不在 .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是通用中间语言 ,这是它的正式名称。它以前称为MSIL或Microsoft中间语言,因为微软最初开发它。)制作使用Unity引擎的游戏的程序员通常用C#编写自己的代码,尽管其他一些语言得到支持。

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

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

有两种情况你可能会在Ubuntu上看到.dll文件:

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

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

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

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