Cosa stanno facendo i file .dll nei programmi Linux?


20

I giochi creati con Unity3D per Linux contengono .dllfile nella loro cartella di dati GameDataFolder/Managed.

Il che è strano perché pensavo che Linux usasse i .sofile anziché i .dllfile.

(Lo stesso vale anche per le app Android-Unity3D.)

Perché?

Risposte:


25

I giochi di cui stai parlando sono basati su .NET Framework e in esecuzione con Mono, che è un'implementazione gratuita e open source di .NET Framework di Microsoft.

Poiché queste applicazioni sono basate su .NET, gli assembly hanno estensione .dll. Quindi puoi vedere i file DLL nelle cartelle.

Un programma .NET progettato per l'uso multipiattaforma può essere eseguito su Windows, Linux o Mac, con gli stessi "binari" (comprese le DLL che sono anche assembly), che sono compilati in MSIL e richiedono un runtime .NET / Mono per essere eseguiti .

Nota che hai anche alcune applicazioni gratuite (non solo giochi) basate su Mono Framework disponibili nei repository Ubuntu. Ad esempio: Tomboy.


11
Si noti inoltre che quelle dll non sono dll di Windows "reali", ma in realtà compilato bytecode .NET.
Sanya_Zol,

5
Si noti inoltre che le estensioni di file, incluso .dlle .so, sono prive di significato in Linux. Sono usati solo per nostra comodità.
code_dredd,

1
@ray Puoi spiegarmi? Ho pensato che fossero ancora uno standard per trasmettere informazioni sul tipo di file, quindi non sono prive di significato?
FMaz,

2
@FynnMazurkiewicz: è più una questione di tradizioni progettuali leggermente diverse che un singolo attributo centrale che entrambi i sistemi applicano. In effetti, sia il kernel di Windows che il linker dinamico Linux caricheranno felicemente una libreria condivisa (nei loro rispettivi formati), indipendentemente dal fatto che il suo nome file finisca in .dll o .so o qualcos'altro. Per motivi storici, la syscall di LoadLibrary in Windows in alcuni casi aggiungerà ".dll" al nome file se non ha già un'estensione, ma non è in genere utilizzato .
Henning Makholm,

1
@ray non del tutto: gccnon troverà una libreria fornita come ad esempio -lmse il nome del suo file non termina con .sooo .avarianti della versione.
Ruslan,

9

I .dllfile in GameDataFolder/Managedappartengono a un programma di codice nativo che utilizza Mono internamente.

Il motore di gioco Unity incorpora Mono (anche sulla maggior parte delle piattaforme Windows).

Gli eseguibili multipiattaforma e le librerie condivise che possono essere eseguite da .NET Common Language Runtime o Mono sono spesso denominati .exee con .dllsuffissi, anche quando non sono specifici di Windows. Quando trovi un .dllfile in un programma per un sistema GNU / Linux come Ubuntu o per qualsiasi sistema operativo tranne Windows, di solito è questo il motivo. La maggior parte delle volte trovi un .dllin un sistema Ubuntu, la risposta di Golboth lo spiega. Ma non è proprio quello che sta succedendo qui.

Il motore di gioco Unity - che non deve essere confuso con l'interfaccia grafica predefinita nella maggior parte delle versioni di Ubuntu - è un popolare motore di gioco multipiattaforma proprietario. Questo motore non funziona su .NET Framework o Mono. Invece, incorpora Mono , vale a dire che Mono scorre sopra di esso. Questo è il modo in cui gli sviluppatori scrivono qualsiasi codice di cui il loro gioco ha bisogno e che non sia già parte del motore Unity.

In generale, Mono può essere utilizzato allo stesso modo in cui viene normalmente utilizzato il CLR .NET di Microsoft, per eseguire programmi .NET / Mono completi. Ma Mono è anche progettato per essere facilmente integrabile in applicazioni di codice nativo , anche per consentire la personalizzazione di tali applicazioni . Questo è ciò che sta accadendo nella situazione che stai descrivendo. I file visualizzati non appartengono a un programma che viene eseguito direttamente su Mono o su CLR .NET. Invece appartengono a un programma in codice nativo che incorpora Mono.

Come il motore di gioco Unity utilizza Mono

Il motore di gioco Unity, che è scritto principalmente in C ++, ospita la propria istanza di Mono, che non utilizza - e potrebbe essere diversa dalla - versione (se presente) installata tramite il gestore di pacchetti del sistema. Questo runtime Mono incorporato non può essere utilizzato per eseguire programmi .NET / Mono autonomi, perché non è questo lo scopo. Invece, la parte di codice nativa del motore lo utilizza per eseguire il codice CIL. (CIL è Common Intermediate Language , che è il suo nome ufficiale. In precedenza era chiamato MSIL o Microsoft Intermediate Language, da quando Microsoft lo ha sviluppato in origine.) I programmatori che realizzano giochi che utilizzano il motore Unity di solito scrivono il proprio codice in C #, anche se alcune altre lingue sono supportati.

Il motore Unity incorpora Mono anche in Windows. Per i giochi della piattaforma Windows universale - e nessun'altra piattaforma - utilizza Microsoft .NET Framework anziché Mono. Ma la maggior parte dei giochi Unity sulla maggior parte delle piattaforme, inclusa la maggior parte dei dispositivi mobili e delle console di gioco, inclusi Ubuntu e Windows, usa Mono. Su alcune piattaforme IL2CPP è disponibile in alternativa a Mono e su alcune è supportato solo IL2CPP. Vedi Restrizioni agli script per i dettagli.

Altre situazioni in cui è possibile visualizzare i .dllfile su Ubuntu

Sono .dllstate descritte due situazioni in cui è probabile che tu veda un file su Ubuntu:

  1. Una libreria condivisa che deve essere utilizzata da un'applicazione .NET / Mono. La risposta di Golboth lo descrive in dettaglio. Questo è ciò che la maggior parte delle .dlls vedrai su un sistema Ubuntu. Semplicemente non capita a cosa servono i .dllfile nella tua GameDataFolder/Managedcartella.
  2. Un file che fornisce il codice utilizzato da un runtime Mono incorporato per fornire "script" per un'applicazione di codice nativo. Ecco cosa sta succedendo in questo caso.

Esistono altri due casi ragionevolmente comuni in cui è possibile visualizzare un .dllfile su Ubuntu:

  1. Il compilatore per .NET Core produce .dllfile anziché .exefile, anche quando ciò che si sta compilando non è una libreria. Il runtime .NET Core (chiamato CoreCLR) e non il normale .NET Framework o Mono, esegue questi file. .NET Core è un prodotto Microsoft, ma a differenza del .NET Framework standard, .NET Core è multipiattaforma con supporto ufficiale per sistemi GNU / Linux come Ubuntu ed è un software open source gratuito .
  2. A volte un .dllfile che vedi su Ubuntu sarà solo una libreria di Windows. È possibile che ciò venga visualizzato se il programma viene archiviato in un sistema Ubuntu ma viene eseguito su Windows o se si monta un'unità Windows in Ubuntu. Potresti anche vederlo in relazione a programmi che possono essere eseguiti su Ubuntu utilizzando Wine , incluso il software fornito con Wine o che si installa automaticamente winetricksper supportare altri software Windows.

Questo non è un tentativo di elencare esaurientemente tutte le circostanze in cui potresti riscontrare un .dllsu Ubuntu. (Ad esempio, potrebbe anche essere una libreria OS / 2. ) Tuttavia, credo che questi quattro casi siano i più comuni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.