Que font les .dll dans les programmes Linux?

20

Les jeux créés avec Unity3D pour Linux contiennent des .dllfichiers dans leur dossier de données GameDataFolder/Managed.

Ce qui est bizarre parce que je pensais que Linux utilise des .sofichiers au lieu de .dllfichiers.

(Il en va de même pour les applications Android-Unity3D également.)

Pourquoi?

IronPig
la source

Réponses:

25

Les jeux dont vous parlez sont basés sur le .NET Framework et fonctionnent avec Mono, qui est une implémentation gratuite et open-source du .NET Framework de Microsoft.

Étant donné que ces applications sont basées sur .NET, les assemblys ont l'extension .dll. Vous pouvez donc voir les fichiers DLL dans les dossiers.

Un programme .NET conçu pour une utilisation multiplateforme peut s'exécuter sur Windows, Linux ou Mac, avec les mêmes "binaires" (y compris les DLL qui sont également des assemblages), qui sont compilés dans MSIL et nécessitent un runtime .NET / Mono pour être exécuté .

Veuillez noter que vous avez également des applications gratuites (pas seulement des jeux) basées sur Mono Framework disponibles dans les référentiels Ubuntu. Par exemple: Tomboy.

Golboth
la source
11
Notez également que ces DLL ne sont pas de "vraies" DLL Windows mais en fait du bytecode .NET compilé.
Sanya_Zol
5
Notez également que les extensions de fichier, y compris .dllet .so, n'ont aucun sens sous Linux. Ils ne sont utilisés que pour notre commodité.
code_dredd
1
@ray Pouvez-vous expliquer? Je pensais qu'ils étaient toujours une norme pour transmettre des informations sur le type de fichier, donc ne sont-ils pas dénués de sens?
FMaz
2
@FynnMazurkiewicz: Il s'agit davantage de traditions de conception légèrement différentes que d'un seul attribut central que l'un ou l'autre système applique. En fait, à la fois le noyau Windows et l'éditeur de liens de dynamique Linux se fera un plaisir de charger une bibliothèque partagée (dans leurs formats respectifs) , peu importe si son nom de fichier se termine par .dll , .so ou autre chose. Pour des raisons historiques, l'appel système LoadLibrary dans Windows ajoutera dans certains cas ".dll" au nom de fichier s'il n'a pas déjà d'extension, mais ce n'est pas ainsi qu'il est généralement utilisé .
Henning Makholm
1
@ray pas tout à fait: gccne trouvera pas une bibliothèque fournie comme par exemple -lmsi son nom de fichier ne se termine pas par .soou .aou des versions versionnées de celui-ci.
Ruslan
9

Les .dllfichiers GameDataFolder/Managedappartiennent à un programme de code natif qui utilise Mono en interne.

Le moteur de jeu Unity intègre Mono (même sur la plupart des plates-formes Windows).

Les exécutables multiplateformes et les bibliothèques partagées qui peuvent être exécutés soit par le .NET Common Language Runtime soit par Mono sont souvent nommés avec .exeet .dllsuffixes, respectivement, même lorsqu'ils ne sont pas spécifiques à Windows. Lorsque vous trouvez un .dllfichier dans un programme pour un système GNU / Linux comme Ubuntu, ou pour tout système d'exploitation mais Windows, c'est généralement la raison. La plupart du temps, vous trouvez un .dlldans un système Ubuntu, la réponse de Golboth l' explique. Mais ce n'est pas tout à fait ce qui se passe ici.

Le moteur de jeu Unity - qui ne doit pas être confondu avec l'interface graphique par défaut dans la plupart des versions d'Ubuntu - est un moteur de jeu multiplateforme propriétaire et populaire. Ce moteur ne fonctionne pas sur .NET Framework ou Mono. Au lieu de cela, il intègre Mono , c'est-à-dire que Mono fonctionne dessus. C'est ainsi que les développeurs écrivent le code dont leur jeu a besoin et qui ne fait pas déjà partie du moteur Unity.

En général, Mono peut être utilisé de la même manière que le .NET CLR de Microsoft est généralement utilisé, pour exécuter des programmes .NET / Mono complets. Mais Mono est également conçu pour être facilement intégrable dans des applications de code natif , notamment pour permettre à ces applications d'être personnalisées . C'est ce qui se passe dans la situation que vous décrivez. Les fichiers que vous voyez n'appartiennent pas à un programme qui s'exécute directement au-dessus de Mono ou du .NET CLR. Au lieu de cela, ils appartiennent à un programme en code natif qui intègre Mono.

Comment le moteur de jeu Unity utilise Mono

Le moteur de jeu Unity, qui est écrit principalement en C ++, héberge sa propre instance de Mono, qui n'utilise pas - et peut être différente de - la version (le cas échéant) installée via le gestionnaire de packages de votre système. Ce runtime Mono intégré ne peut pas être utilisé pour exécuter des programmes .NET / Mono autonomes, car ce n'est pas son objectif. Au lieu de cela, la partie de code natif du moteur l'utilise pour exécuter le code CIL. (CIL est Common Intermediate Language , qui est son nom officiel. Il était auparavant appelé MSIL ou Microsoft Intermediate Language, car Microsoft l'a développé à l'origine.) Les programmeurs qui créent des jeux qui utilisent le moteur Unity écrivent généralement leur propre code en C #, bien que d'autres langues sont pris en charge.

Le moteur Unity intègre Mono même dans Windows. Pour les jeux de plateforme Windows universelle - et aucune autre plateforme - il utilise Microsoft .NET Framework au lieu de Mono. Mais la majorité des jeux Unity sur la plupart des plates-formes, y compris la plupart des appareils mobiles et des consoles de jeux, y compris Ubuntu et Windows, utilisent Mono. Sur certaines plates-formes, IL2CPP est disponible comme alternative à Mono, et sur quelques-unes seulement IL2CPP est pris en charge. Voir Restrictions de script pour plus de détails.

Autres situations où vous pouvez voir des .dllfichiers sur Ubuntu

Deux situations où vous êtes susceptible de voir un .dllfichier sur Ubuntu ont été décrites:

  1. Une bibliothèque partagée destinée à être utilisée par une application .NET / Mono. La réponse de Golboth décrit cela en détail. C'est ce que .dllvous verrez le plus sur un système Ubuntu. Il ne se trouve tout simplement pas à quoi servent les .dllfichiers de votre GameDataFolder/Manageddossier.
  2. Fichier fournissant du code utilisé par un runtime Mono intégré pour fournir des «scripts» pour une application de code natif. C'est ce qui se passe dans ce cas.

Il existe deux autres cas raisonnablement courants où vous pouvez voir un .dllfichier sur Ubuntu:

  1. Le compilateur pour .NET Core produit des .dllfichiers plutôt que des .exefichiers, même lorsque ce que vous compilez n'est pas une bibliothèque. Le runtime .NET Core (appelé CoreCLR), et non le .NET Framework ou Mono normal, exécute ces fichiers. .NET Core est un produit Microsoft, mais contrairement au .NET Framework standard, .NET Core est multiplateforme avec un support officiel pour les systèmes GNU / Linux comme Ubuntu, et il s'agit d'un logiciel open source gratuit .
  2. Parfois, un .dllfichier que vous voyez sur Ubuntu sera juste une bibliothèque Windows. Vous pouvez le voir si le programme est stocké sur un système Ubuntu mais s'exécute sur Windows, ou si vous montez un lecteur Windows dans Ubuntu. Vous pouvez également le voir en relation avec des programmes pouvant être exécutés sur Ubuntu à l'aide de Wine , y compris les logiciels fournis avec Wine ou que vous installez automatiquement avec winetrickspour prendre en charge d'autres logiciels Windows.

Il ne s'agit pas d'une liste exhaustive de toutes les circonstances dans lesquelles vous pouvez rencontrer un .dllsur Ubuntu. (Par exemple, il pourrait également s'agir d' une bibliothèque OS / 2. ) Cependant, je pense que ces quatre cas sont les plus courants.

Eliah Kagan
la source