使用Unity3D制作的Linux游戏在其数据文件夹中包含.dll文件。
这很奇怪,因为我以为Linux使用.so文件而不是.dll文件。
(对于Android-Unity3D应用程序也是如此。)
为什么呢?
使用Unity3D制作的Linux游戏在其数据文件夹中包含.dll文件。
这很奇怪,因为我以为Linux使用.so文件而不是.dll文件。
(对于Android-Unity3D应用程序也是如此。)
为什么呢?
你所提到的游戏是基于.NET Framework并使用Mono运行,Mono是Microsoft .NET Framework的免费开源实现。
由于这些应用程序是基于.NET的,因此程序集具有.dll扩展名。所以你可以在文件夹中看到DLL文件。
为了实现跨平台,一个设计用于多平台的.NET程序可以在Windows、Linux或Mac上运行,使用相同的"二进制文件"(包括也是程序集的DLL文件),这些文件编译为MSIL,并需要.NET/Mono运行时来执行。
请注意,在Ubuntu软件仓库中还有一些基于Mono Framework的免费应用程序(不仅限于游戏)。例如:Tomboy。
GameDataFolder/Managed
中的.dll
文件属于一个内部使用Mono的本机代码程序。
跨平台的可执行文件和共享库,既可以由.NET公共语言运行时,也可以由Mono运行,通常分别使用.exe
和.dll
后缀进行命名,即使它们不仅限于Windows。当您在像Ubuntu这样的GNU/Linux系统的程序中找到一个.dll
文件,或者对于除Windows以外的任何操作系统,通常就是这个原因。通常情况下,您在Ubuntu系统中找到.dll
文件时,Golboth's answer解释了其中的原因。但这里发生的事情稍有不同。
Unity游戏引擎--不要与大多数Ubuntu版本中的默认图形界面混淆--是一款流行的专有跨平台游戏引擎。 该引擎不在.NET Framework或Mono之上运行。 相反,它嵌入了Mono, 也就是说Mono在其之上运行。这是开发人员编写游戏所需代码的方式,这些代码不是Unity引擎的一部分。
一般来说,Mono可以像微软的.NET CLR一样使用,用于运行完整的.NET/Mono程序。但是Mono还被设计成可以轻松嵌入到本地代码应用程序中,包括使这些应用程序能够进行定制。这就是你所描述的情况。你看到的文件不属于直接在Mono或.NET CLR之上运行的程序,而是属于嵌入了Mono的本地代码程序。.dll
文件的其他情况已经描述了两种在Ubuntu上可能会看到.dll
文件的情况:
.dll
文件。只是恰好不是你的GameDataFolder/Managed
文件夹中的.dll
文件的用途。.dll
文件:
.dll
文件,而不是.exe
文件,即使你要编译的内容并非库。这些文件在.NET Core运行时(称为CoreCLR)上运行,而不是普通的.NET Framework或Mono。.NET Core是微软的产品,但与标准的.NET Framework不同,.NET Core是跨平台的,对GNU/Linux系统(如Ubuntu)有官方支持,并且它是免费开源软件。.dll
文件只是一个Windows库。如果程序存储在Ubuntu系统上但在Windows上运行,或者在Ubuntu中挂载了Windows驱动器,您可能会看到这种情况。您还可能在与能够使用Wine在Ubuntu上运行的程序相关联的情况下看到它,包括使用Wine提供的软件或使用winetricks
自动安装以支持其他Windows软件的软件。.dll
的所有情况。(例如,它也可能是一个OS/2库。)然而,我相信这四种情况是最常见的。
.dll
和.so
,是没有意义的。它们只是为了我们的方便而使用的。 - code_dredd.so
或.a
或其版本化变体结尾,gcc
将无法找到像-lm
这样提供的库。 - Ruslangcc
的-l
选项的man页面表明你指出的只是一种惯例,而不是扩展名实际上是必需的。"链接器会在标准目录列表中搜索库文件,实际上是一个名为liblibrary.a的文件... [the] -l会在library两侧加上lib和.a,并搜索多个目录。"
- code_dreddls
、cat
等),它们都没有文件扩展名来“标记”它们为可执行文件;实际上,它们能够执行是由文件权限和它们是程序这个事实共同决定的。如果一个可执行文件被重命名为.txt
扩展名,并且具有正确的权限设置,仍然可以运行它。 - code_dredd.
,这样它就可以在加载时不会自动添加.dll
。 - wizzwizz4