Was machen DLLs in Linux-Programmen?

20

Spiele, die mit Unity3D für Linux erstellt wurden, enthalten .dllDateien in ihrem Datenordner GameDataFolder/Managed.

Was seltsam ist, weil ich dachte, dass Linux .soDateien anstelle von .dllDateien verwendet.

(Gleiches gilt auch für Android-Unity3D-Apps.)

Warum?

IronPig
quelle

Antworten:

25

Die Spiele, über die Sie sprechen, basieren auf .NET Framework und laufen mit Mono, einer kostenlosen und Open-Source-Implementierung von Microsoft .NET Framework.

Da diese Anwendungen auf .NET basieren, haben Assemblies die Erweiterung .dll. So können Sie DLL-Dateien in den Ordnern sehen.

Ein für die plattformübergreifende Verwendung entwickeltes .NET-Programm kann unter Windows, Linux oder Mac mit denselben "Binärdateien" (einschließlich DLLs, die auch Assemblys sind) ausgeführt werden, die in MSIL kompiliert wurden und für die eine .NET / Mono-Laufzeit ausgeführt werden muss .

Bitte beachten Sie, dass Sie auch einige kostenlose Anwendungen (nicht nur Spiele) auf der Basis von Mono Framework in Ubuntu-Repositories haben. Zum Beispiel: Wildfang.

Golboth
quelle
11
Beachten Sie auch, dass diese DLLs keine "echten" Windows-DLLs sind, sondern tatsächlich kompilierten .NET-Bytecode.
Sanya_Zol
5
Beachten Sie auch, dass Dateierweiterungen, einschließlich .dllund .so, unter Linux bedeutungslos sind. Sie werden nur zu unserer Bequemlichkeit verwendet.
Code_dredd
1
@ray Kannst du das erklären? Ich dachte, sie sind immer noch ein Standard für die Übermittlung von Dateitypinformationen, sind sie also nicht bedeutungslos?
FMaz
2
@FynnMazurkiewicz: Es handelt sich eher um etwas unterschiedliche Designtraditionen als um ein einzelnes zentrales Attribut, das von beiden Systemen erzwungen wird. Tatsächlich laden sowohl der Windows-Kernel als auch der Linux Dynamic Linker problemlos eine gemeinsam genutzte Bibliothek (in ihren jeweiligen Formaten), unabhängig davon, ob der Dateiname auf .dll oder .so oder auf etwas anderes endet. Aus historischen Gründen hängt der LoadLibrary-Systemaufruf in Windows in einigen Fällen ".dll" an den Dateinamen an, wenn er noch keine Erweiterung hat, dies wird jedoch normalerweise nicht verwendet .
Henning Makholm
1
@ray nicht ganz: gccWird keine Bibliothek finden, die wie zB geliefert wird, -lmwenn der Dateiname nicht mit .sooder .aoder versionierten Varianten davon endet .
Ruslan
9

Die .dllDateien in GameDataFolder/Managedgehören zu einem nativen Code-Programm, das intern Mono verwendet.

Der Motor Unity Spiel bettet Mono (auch auf den meisten Windows - Plattformen).

Plattformübergreifende ausführbare Dateien und gemeinsam genutzte Bibliotheken, die entweder von .NET Common Language Runtime oder von Mono ausgeführt werden können, werden häufig mit .exeund .dllSuffixen benannt, auch wenn sie nicht Windows-spezifisch sind. Wenn Sie eine .dllDatei in einem Programm für ein GNU / Linux-System wie Ubuntu oder für ein anderes Betriebssystem als Windows finden, ist dies normalerweise der Grund. Die meiste Zeit, in der Sie ein .dllin einem Ubuntu-System finden, erklärt Golboths Antwort es. Aber das ist nicht ganz das, was hier los ist.

Die Unity-Spiele-Engine - die in den meisten Ubuntu-Versionen nicht mit der standardmäßigen grafischen Oberfläche zu verwechseln ist - ist eine beliebte proprietäre plattformübergreifende Spiele-Engine. Diese Engine wird nicht über .NET Framework oder Mono ausgeführt. Stattdessen wird Mono eingebettet , was bedeutet, dass Mono darauf ausgeführt wird. Auf diese Weise schreiben Entwickler den Code, den sie für ihr Spiel benötigen, der noch nicht Teil der Unity-Engine ist.

Im Allgemeinen kann Mono auf die gleiche Weise wie die .NET CLR von Microsoft verwendet werden, um vollständige .NET / Mono-Programme auszuführen. Mono ist jedoch auch so konzipiert, dass es problemlos in native Code-Anwendungen eingebettet werden kann , einschließlich der Möglichkeit, diese Anwendungen anzupassen . Genau das passiert in der Situation, die Sie beschreiben. Die angezeigten Dateien gehören nicht zu einem Programm, das direkt auf Mono oder der .NET-CLR ausgeführt wird. Stattdessen gehören sie zu einem Native-Code-Programm, in das Mono eingebettet ist.

Wie die Unity Game Engine Mono verwendet

Die Unity-Game-Engine, die hauptsächlich in C ++ geschrieben ist, hostet eine eigene Instanz von Mono, die die über den Paket-Manager Ihres Systems installierte Version (falls vorhanden) nicht verwendet und möglicherweise von dieser Version abweicht. Diese eingebettete Mono-Laufzeit kann nicht zum Ausführen von eigenständigen .NET / Mono-Programmen verwendet werden, da dies nicht der Zweck ist. Stattdessen verwendet der native Codeteil des Moduls ihn zum Ausführen von CIL-Code. (CIL ist die Common Intermediate Language , deren offizieller Name MSIL oder Microsoft Intermediate Language ist, da Microsoft sie ursprünglich entwickelt hat.) Programmierer, die Spiele mit der Unity-Engine erstellen, schreiben in der Regel ihren eigenen Code in C #, jedoch in einigen anderen Sprachen sind unterstützt.

Die Unity-Engine bettet Mono sogar in Windows ein. Für Universal Windows Platform- Spiele - und keine anderen Plattformen - wird Microsoft .NET Framework anstelle von Mono verwendet. Die meisten Unity-Spiele auf den meisten Plattformen, einschließlich der meisten Mobilgeräte und Spielekonsolen sowie Ubuntu und Windows, verwenden jedoch Mono. Auf einigen Plattformen ist IL2CPP als Alternative zu Mono verfügbar, und auf einigen wird nur IL2CPP unterstützt. Weitere Informationen finden Sie unter Skripteinschränkungen .

Andere Situationen, in denen unter .dllUbuntu möglicherweise Dateien angezeigt werden

Es wurden zwei Situationen beschrieben, in denen unter .dllUbuntu wahrscheinlich eine Datei angezeigt wird:

  1. Eine gemeinsam genutzte Bibliothek, die von einer .NET / Mono-Anwendung verwendet werden soll. Golboths Antwort beschreibt dies im Detail. Dies ist, was die meisten .dlls, die Sie auf einem Ubuntu-System sehen werden, sind. Es ist einfach nicht so, wofür die .dllDateien in Ihrem GameDataFolder/ManagedOrdner bestimmt sind.
  2. Eine Datei, die Code bereitstellt, der von einer eingebetteten Mono-Laufzeit verwendet wird, um "Scripting" für eine native Codeanwendung bereitzustellen. Das ist, was in diesem Fall los ist.

Es gibt zwei weitere Fälle, in denen Sie möglicherweise eine .dllDatei auf Ubuntu sehen:

  1. Der Compiler für .NET Core erstellt .dllDateien anstelle von .exeDateien, auch wenn es sich bei dem, was Sie kompilieren, nicht um eine Bibliothek handelt. Die .NET Core-Laufzeit (CoreCLR genannt) und nicht das reguläre .NET Framework oder Mono führen diese Dateien aus. .NET Core ist ein Microsoft - Produkt, aber im Gegensatz zu dem Standard - .NET Framework .NET Core ist Cross-Plattform mit offizieller Unterstützung für GNU / Linux - Systeme wie Ubuntu, und es ist freie Open - Source - Software .
  2. Manchmal ist eine .dllDatei, die Sie unter Ubuntu sehen, nur eine Windows-Bibliothek. Möglicherweise wird dies angezeigt, wenn das Programm auf einem Ubuntu-System gespeichert ist, aber unter Windows ausgeführt wird oder wenn Sie ein Windows-Laufwerk in Ubuntu bereitstellen. Sie können es auch in Verbindung mit Programmen sehen, die unter Ubuntu mit Wine ausgeführt werden können , einschließlich Software, die mit Wine geliefert wird oder die Sie automatisch installieren winetricks, um andere Windows-Software zu unterstützen.

Dies ist kein Versuch, alle Umstände, unter denen Sie .dllauf Ubuntu stoßen könnten, vollständig aufzulisten. (Zum Beispiel könnte es sich auch um eine OS / 2-Bibliothek handeln .) Ich glaube jedoch, dass diese vier Fälle die häufigsten sind.

Eliah Kagan
quelle