¿Qué están haciendo los .dlls en los programas de Linux?

20

Los juegos que se hicieron con Unity3D para Linux contienen .dllarchivos en su carpeta de datos GameDataFolder/Managed.

Lo cual es extraño porque pensé que Linux usa .soarchivos en lugar de .dllarchivos.

(Lo mismo es cierto para las aplicaciones Android-Unity3D también).

¿Por qué?

IronPig
fuente

Respuestas:

25

Los juegos de los que habla están basados ​​en .NET Framework y se ejecutan con Mono, que es una implementación gratuita y de código abierto de .NET Framework de Microsoft.

Debido a que estas aplicaciones están basadas en .NET, los ensamblados tienen la extensión .dll. Para que pueda ver los archivos DLL en las carpetas.

Un programa .NET diseñado para uso multiplataforma puede ejecutarse en Windows, Linux o Mac, con los mismos "binarios" (incluidas las DLL que también son ensamblados), que se compilan en MSIL y necesitan un tiempo de ejecución .NET / Mono para ejecutarse .

Tenga en cuenta que también tiene algunas aplicaciones gratuitas (no solo juegos) basadas en Mono Framework disponibles en los repositorios de Ubuntu. Por ejemplo: Tomboy.

Golboth
fuente
11
También tenga en cuenta que esos dll no son dll de Windows "reales" sino que en realidad compilaron .NET bytecode.
Sanya_Zol
55
También tenga en cuenta que las extensiones de archivo, incluidos .dlly .so, no tienen sentido en Linux. Solo se usan para nuestra conveniencia.
code_dredd
1
@ray ¿Puedes explicarlo? Pensé que todavía son un estándar para transmitir información de tipo de archivo, por lo tanto, ¿no tienen sentido?
FMaz
2
@FynnMazurkiewicz: es más una cuestión de tradiciones de diseño ligeramente diferentes que un solo atributo central que cualquiera de los dos sistemas impone. De hecho, tanto el kernel de Windows como el enlazador dinámico de Linux cargarán felizmente una biblioteca compartida (en sus respectivos formatos) sin importar si su nombre de archivo termina en .dll o .so o algo más. Por razones históricas, la llamada al sistema de LoadLibrary en Windows en algunos casos agregará ".dll" al nombre del archivo si aún no tiene una extensión, pero esa no es la forma en que se usa normalmente .
Henning Makholm
1
@ray no del todo: gccno encontrarán una biblioteca suministrado como por ejemplo, -lmsi el nombre del archivo no termina con .soo .ao versionado variantes de las mismas.
Ruslan
9

Los .dllarchivos GameDataFolder/Managedpertenecen a un programa de código nativo que usa Mono internamente.

El motor del juego Unity incorpora Mono (incluso en la mayoría de las plataformas Windows).

Los ejecutables multiplataforma y las bibliotecas compartidas que pueden ejecutarse con .NET Common Language Runtime o Mono a menudo se nombran con .exey .dllsufijos, respectivamente, incluso cuando no son específicos de Windows. Cuando encuentra un .dllarchivo en un programa para un sistema GNU / Linux como Ubuntu, o para cualquier sistema operativo que no sea Windows, generalmente es por eso. La mayoría de las veces encuentras un .dllen un sistema Ubuntu, la respuesta de Golboth lo explica. Pero eso no es exactamente lo que está pasando aquí.

El motor del juego Unity , que no debe confundirse con la interfaz gráfica predeterminada en la mayoría de las versiones de Ubuntu, es un popular motor de juegos multiplataforma patentado. Este motor no se ejecuta sobre .NET Framework o Mono. En cambio, incorpora Mono , lo que quiere decir que Mono se ejecuta encima de él. Así es como los desarrolladores escriben el código que su juego necesita que no forma parte del motor de Unity.

En general, Mono se puede usar de la misma manera que se usa .NET CLR de Microsoft, para ejecutar programas completos de .NET / Mono. Pero Mono también está diseñado para integrarse fácilmente en aplicaciones de código nativo , incluso para permitir que esas aplicaciones se personalicen . Eso es lo que está sucediendo en la situación que está describiendo. Los archivos que está viendo no pertenecen a un programa que se ejecuta directamente sobre Mono o .NET CLR. En cambio, pertenecen a un programa de código nativo que incorpora Mono.

Cómo el motor de juego de Unity usa Mono

El motor del juego Unity, que está escrito principalmente en C ++, aloja su propia instancia de Mono, que no utiliza, y puede ser diferente de, la versión (si la hay) instalada a través del administrador de paquetes de su sistema. Este tiempo de ejecución Mono integrado no se puede utilizar para ejecutar programas .NET / Mono independientes, porque ese no es su propósito. En cambio, la parte del código nativo del motor lo usa para ejecutar el código CIL. (CIL es Common Intermediate Language , que es su nombre oficial. Anteriormente se llamaba MSIL o Microsoft Intermediate Language, ya que Microsoft lo desarrolló originalmente). Los programadores que hacen juegos que usan el motor Unity generalmente escriben su propio código en C #, aunque en otros idiomas son compatibles.

El motor de Unity incorpora Mono incluso en Windows. Para los juegos de la Plataforma universal de Windows , y ninguna otra plataforma, utiliza Microsoft .NET Framework en lugar de Mono. Pero la mayoría de los juegos de Unity en la mayoría de las plataformas, incluidos la mayoría de los dispositivos móviles y las consolas de juegos, incluidos Ubuntu y Windows, usan Mono. En algunas plataformas, IL2CPP está disponible como alternativa a Mono, y en algunas solo se admite IL2CPP. Consulte Restricciones de secuencias de comandos para más detalles.

Otras situaciones en las que puede ver .dllarchivos en Ubuntu

Se .dllhan descrito dos situaciones en las que es probable que vea un archivo en Ubuntu:

  1. Una biblioteca compartida que está destinada a ser utilizada por una aplicación .NET / Mono. La respuesta de Golboth describe esto en detalle. Esto es lo que más .dllverás en un sistema Ubuntu. Simplemente no es para lo que son los .dllarchivos en su GameDataFolder/Managedcarpeta.
  2. Un archivo que proporciona el código que utiliza un tiempo de ejecución Mono integrado para proporcionar "secuencias de comandos" para una aplicación de código nativo. Eso es lo que está pasando en este caso.

Hay otros dos casos razonablemente comunes en los que puede ver un .dllarchivo en Ubuntu:

  1. El compilador para .NET Core produce .dllarchivos en lugar de .exearchivos, incluso cuando lo que está compilando no es una biblioteca. El tiempo de ejecución de .NET Core (llamado CoreCLR), y no el .NET Framework o Mono, ejecuta estos archivos. .NET Core es un producto de Microsoft, pero a diferencia del .NET Framework estándar, .NET Core es multiplataforma con soporte oficial para sistemas GNU / Linux como Ubuntu, y es un software gratuito de código abierto .
  2. A veces, un .dllarchivo que ves en Ubuntu solo será una biblioteca de Windows. Puede ver esto si el programa se está almacenando en un sistema Ubuntu pero se ejecuta en Windows, o si monta una unidad de Windows en Ubuntu. También puede verlo en relación con programas que se pueden ejecutar en Ubuntu usando Wine , incluido el software que viene con Wine o que instala automáticamente winetrickspara admitir otro software de Windows.

Este no es un intento de enumerar exhaustivamente todas las circunstancias en las que puede encontrar un .dllen Ubuntu. (Por ejemplo, también podría ser una biblioteca OS / 2 ). Sin embargo, creo que esos cuatro casos son los más comunes.

Eliah Kagan
fuente