Что делают .dll в программах Linux?

20

Игры, созданные с использованием Unity3D для Linux, содержат .dllфайлы в папке с данными GameDataFolder/Managed.

Что странно, потому что я думал, что Linux использует .soфайлы вместо .dllфайлов.

(То же самое относится и к приложениям Android-Unity3D.)

Зачем?

IronPig
источник

Ответы:

25

Игры, о которых вы говорите, основаны на .NET Framework и работают с Mono, которая является бесплатной реализацией Microsoft .NET Framework с открытым исходным кодом.

Поскольку эти приложения основаны на .NET, сборки имеют расширение .dll. Таким образом, вы можете увидеть файлы DLL в папках.

Одна программа .NET, предназначенная для кроссплатформенного использования, может запускаться в Windows, Linux или Mac с теми же «двоичными файлами» (включая библиотеки DLL, которые также являются сборками), которые скомпилированы в MSIL и требуют выполнения среды выполнения .NET / Mono. ,

Обратите внимание, что у вас также есть несколько бесплатных приложений (не только игр) на основе Mono Framework, доступных в репозиториях Ubuntu. Например: сорванец.

Golboth
источник
11
Также обратите внимание, что эти библиотеки не являются «настоящими» Windows DLL, а фактически скомпилированы .NET байт-код.
Sanya_Zol
5
Также обратите внимание, что расширения файлов, в том числе .dllи .so, не имеют смысла в Linux. Они используются только для нашего удобства.
code_dredd
1
@ray Можешь объяснить? Я думал, что они все еще являются стандартом для передачи информации о типе файла, поэтому не бессмысленны?
FMaz
2
@FynnMazurkiewicz: Это скорее вопрос слегка отличающихся традиций проектирования, чем одного центрального атрибута, который применяет любая из систем. Фактически, и ядро Windows, и динамический компоновщик Linux с удовольствием загрузят совместно используемую библиотеку (в их соответствующих форматах) независимо от того, оканчивается ли ее имя на .dll или .so или что-то еще. По историческим причинам LoadLibrary в системный вызов Windows , в некоторых случаях будет добавить «.dll» к имени файла , если он не имеет расширение уже, но это не так, как это обычно используется .
Хеннинг
1
@ray не совсем: gccне найдет предоставленную библиотеку, например, -lmесли имя ее файла не заканчивается .soили .aили ее версионные варианты.
Руслан
9

Эти .dllфайлы GameDataFolder/Managedпринадлежат к родной код программы , которая использует Mono внутренне.

Игровой движок Unity встраивает Mono (даже на большинстве платформ Windows).

Кроссплатформенные исполняемые файлы и общие библиотеки, которые могут запускаться в среде .NET Common Language Runtime или Mono, часто именуются .exeи .dllсуффиксами соответственно, даже если они не относятся к Windows. Когда вы находите .dllфайл в программе для системы GNU / Linux, такой как Ubuntu, или для любой другой ОС, кроме Windows, обычно это происходит именно по этой причине. Ответ Голбота объясняет это в большинстве случаев .dllв системе Ubuntu . Но это не совсем то, что здесь происходит.

Игровой движок Unity - который не следует путать с графическим интерфейсом по умолчанию в большинстве выпусков Ubuntu --is популярный фирменный кросс-платформенный игровой движок. Этот механизм не работает поверх .NET Framework или 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, так как Microsoft разработала его изначально.) Программисты, делающие игры, использующие движок Unity, обычно пишут свой собственный код на C #, хотя некоторые другие языки поддерживаются.

Движок Unity встраивает Mono даже в Windows. Для игр на универсальной платформе Windows - и никаких других платформ - вместо моно используется Microsoft .NET Framework. Но большинство игр Unity на большинстве платформ, включая большинство мобильных устройств и игровых консолей, а также Ubuntu и Windows, используют Mono. На некоторых платформах IL2CPP доступен в качестве альтернативы Mono, а на некоторых поддерживается только IL2CPP. См. Сценарии ограничения для деталей.

Другие ситуации, когда вы можете увидеть .dllфайлы на Ubuntu

Были описаны две ситуации, когда вы можете увидеть .dllфайл в Ubuntu:

  1. Общая библиотека, предназначенная для использования приложением .NET / Mono. В ответе Голбота это подробно описано. Это то, что .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, или если вы монтируете диск Windows в Ubuntu. Это также может быть связано с программами, которые можно запускать в Ubuntu с помощью Wine , в том числе с программным обеспечением, которое поставляется вместе с Wine, или которое вы устанавливаете автоматически winetricksдля поддержки другого программного обеспечения Windows.

Это не попытка исчерпывающего перечисления всех обстоятельств, когда вы можете столкнуться с .dllUbuntu. (Например, это также может быть библиотека OS / 2. ) Однако я считаю, что эти четыре случая являются наиболее распространенными.

Элия ​​Каган
источник