Apa yang sedang dilakukan .dlls dalam program Linux?

20

Game yang dibuat dengan Unity3D untuk Linux berisi .dllfile di folder data mereka GameDataFolder/Managed.

Yang aneh karena saya pikir Linux menggunakan .sofile, bukan .dllfile.

(Hal yang sama juga berlaku untuk aplikasi Android-Unity3D.)

Mengapa?

IronPig
sumber

Jawaban:

25

Gim yang Anda bicarakan didasarkan pada .NET Framework dan berjalan dengan Mono, yang merupakan implementasi open-source Microsoft Framework.

Karena aplikasi ini berbasis .NET, Assemblies memiliki ekstensi .dll. Jadi Anda bisa melihat file DLL di folder.

Satu. NET program yang dirancang untuk penggunaan lintas platform dapat berjalan di Windows, Linux atau Mac, dengan "binari" yang sama (termasuk DLL yang juga rakitan), yang dikompilasi dalam MSIL dan membutuhkan runtime .NET / Mono untuk dieksekusi .

Harap dicatat bahwa Anda juga memiliki beberapa aplikasi gratis (tidak hanya game) berdasarkan Mono Framework yang tersedia di repositori Ubuntu. Misalnya: Tomboy.

Golboth
sumber
11
Juga perhatikan bahwa dll itu bukan "nyata" windows dll tetapi sebenarnya dikompilasi .NET bytecode
Sanya_Zol
5
Perhatikan juga bahwa ekstensi file, termasuk .dlldan .so, tidak ada artinya di Linux. Mereka hanya digunakan untuk kenyamanan kita.
code_dredd
1
@ray Bisakah Anda jelaskan? Saya pikir mereka masih standar untuk menyampaikan informasi jenis file, maka tidak ada artinya?
FMaz
2
@FynnMazurkiewicz: Ini lebih merupakan masalah tradisi desain yang sedikit berbeda daripada atribut sentral tunggal yang diterapkan oleh kedua sistem. Faktanya, baik kernel Windows dan Linux dynamic linker akan dengan senang hati memuat pustaka bersama (dalam formatnya masing-masing) tidak peduli apakah nama filenya berakhir dengan .dll atau .so atau yang lainnya. Untuk alasan historis syscall LoadLibrary di Windows dalam beberapa kasus akan menambahkan ".dll" ke nama file jika belum memiliki ekstensi, tapi itu bukan bagaimana itu biasanya digunakan .
Henning Makholm
1
@ray tidak cukup: gcctidak akan menemukan perpustakaan yang disediakan seperti misalnya -lmjika nama file tidak diakhiri dengan .soatau .avarian versi darinya.
Ruslan
9

.dllFile - file dalam GameDataFolder/Managedmilik program kode asli yang menggunakan Mono secara internal.

Mesin permainan Unity menanamkan Mono (bahkan di sebagian besar platform Windows).

Eksekusi cross-platform dan pustaka bersama yang dapat dijalankan baik oleh .NET Common Language Runtime atau Mono sering dinamai dengan .exedan .dllsufiks, meskipun tidak khusus untuk Windows. Ketika Anda menemukan .dllfile dalam program untuk sistem GNU / Linux seperti Ubuntu, atau untuk OS apa pun selain Windows, biasanya ini alasannya. Sebagian besar waktu Anda menemukan .dlldi sistem Ubuntu, jawaban Golboth menjelaskannya. Tapi itu tidak cukup apa yang terjadi di sini.

Mesin permainan Unity - yang tidak harus dikacaukan dengan antarmuka grafis default di sebagian besar rilis Ubuntu - adalah mesin permainan lintas platform berpemilik yang populer. Mesin ini tidak berjalan di atas .NET Framework atau Mono. Alih-alih, ia menyematkan Mono , yang artinya Mono berjalan di atasnya. Beginilah cara pengembang menulis kode apa pun yang dibutuhkan permainan mereka yang belum menjadi bagian dari mesin Unity.

Secara umum, Mono dapat digunakan dengan cara yang sama dengan Microsoft. NET CLR biasanya digunakan, untuk menjalankan program .NET / Mono yang lengkap. Tetapi Mono juga dirancang agar mudah disematkan dalam aplikasi kode asli , termasuk untuk memungkinkan aplikasi tersebut disesuaikan . Itulah yang terjadi dalam situasi yang Anda gambarkan. File yang Anda lihat bukan milik program yang berjalan langsung di atas Mono atau .NET CLR. Sebaliknya mereka milik program kode asli yang menyematkan Mono.

Bagaimana Mesin Game Unity Menggunakan Mono

Mesin permainan Unity, yang sebagian besar ditulis dalam C ++, menampung instance Mono sendiri, yang tidak menggunakan - dan mungkin berbeda dari - versi (jika ada) yang diinstal melalui manajer paket sistem Anda. Runtime Mono tertanam ini tidak dapat digunakan untuk menjalankan program .NET / Mono mandiri, karena itu bukan tujuannya. Sebaliknya, bagian kode asli mesin menggunakannya untuk menjalankan kode CIL. (CIL adalah Common Intermediate Language , yang merupakan nama resminya. Sebelumnya disebut MSIL atau Microsoft Intermediate Language, sejak Microsoft mengembangkannya pada awalnya.) Programer yang membuat game yang menggunakan mesin Unity biasanya menulis kode mereka sendiri dalam C #, meskipun beberapa bahasa lain didukung.

Mesin Unity menanamkan Mono bahkan di Windows. Untuk game Universal Windows Platform - dan tidak ada platform lain - ia menggunakan Microsoft .NET Framework alih-alih Mono. Tetapi mayoritas game Unity di sebagian besar platform, termasuk sebagian besar perangkat seluler dan konsol game, dan termasuk Ubuntu dan Windows, menggunakan Mono. Pada beberapa platform, IL2CPP tersedia sebagai alternatif untuk Mono, dan hanya beberapa yang mendukung IL2CPP. Lihat pembatasan Scripting untuk detailnya.

Situasi Lain Di Mana Anda Mungkin Melihat .dllFile di Ubuntu

Dua situasi di mana Anda cenderung melihat .dllfile di Ubuntu telah dijelaskan:

  1. Pustaka bersama yang dimaksudkan untuk digunakan oleh aplikasi .NET / Mono. Jawaban Golboth ini menjelaskan secara rinci. Inilah yang .dllakan Anda lihat pada sistem Ubuntu. Itu tidak terjadi untuk apa .dllfile dalam GameDataFolder/Managedfolder Anda .
  2. File yang menyediakan kode yang digunakan oleh runtime Mono tertanam untuk menyediakan "skrip" untuk aplikasi kode asli. Itulah yang terjadi dalam kasus ini.

Ada dua kasus umum yang cukup umum di mana Anda dapat melihat .dllfile di Ubuntu:

  1. Kompiler untuk .NET Core menghasilkan .dllfile daripada .exefile, bahkan ketika apa yang Anda kompilasi bukan perpustakaan. NET Core runtime (disebut CoreCLR), dan bukan .NET Framework atau Mono biasa, menjalankan file-file ini. .NET Core adalah produk Microsoft, tetapi tidak seperti standar .NET Framework, .NET Core adalah cross-platform dengan dukungan resmi untuk sistem GNU / Linux seperti Ubuntu, dan itu adalah perangkat lunak open source gratis .
  2. Terkadang .dllfile yang Anda lihat di Ubuntu hanya akan menjadi pustaka Windows. Anda dapat melihat ini jika program sedang menyimpan sistem Ubuntu tetapi dijalankan pada Windows, atau jika Anda memasang drive Windows di Ubuntu. Anda juga dapat melihatnya dalam kaitannya dengan program yang dapat dijalankan di Ubuntu menggunakan Wine , termasuk perangkat lunak yang menyertai Wine atau yang Anda instal secara otomatis winetricksuntuk mendukung perangkat lunak Windows lainnya.

Ini bukan upaya untuk mencantumkan secara lengkap semua keadaan di mana Anda mungkin menemukan .dllUbuntu. (Misalnya, bisa juga perpustakaan OS / 2. ) Namun, saya percaya keempat kasus tersebut adalah yang paling umum.

Eliah Kagan
sumber