Co robią .dll w programach Linux?

20

Gry utworzone za pomocą Unity3D dla systemu Linux zawierają .dllpliki w folderze danych GameDataFolder/Managed.

Co jest dziwne, ponieważ myślałem, że Linux używa .soplików zamiast .dllplików.

(To samo dotyczy aplikacji Android-Unity3D).

Dlaczego?

IronPig
źródło

Odpowiedzi:

25

Gry, o których mówisz, oparte są na .NET Framework i działają z Mono, która jest darmową i otwartą implementacją Microsoft .NET Framework.

Ponieważ te aplikacje są oparte na platformie .NET, zestawy mają rozszerzenie .dll. Możesz więc zobaczyć pliki DLL w folderach.

Jeden program .NET zaprojektowany do użytku na różnych platformach może działać w systemie Windows, Linux lub Mac, z tymi samymi „plikami binarnymi” (w tym bibliotekami DLL, które również są zestawami), które są kompilowane w MSIL i wymagają wykonania środowiska uruchomieniowego .NET / Mono .

Pamiętaj, że masz także kilka darmowych aplikacji (nie tylko gier) opartych na Mono Framework dostępnych w repozytoriach Ubuntu. Na przykład: Tomboy.

Golboth
źródło
11
Zauważ również, że te biblioteki DLL nie są „prawdziwymi” bibliotekami DLL systemu Windows, ale faktycznie skompilowanym kodem bajtowym .NET.
Sanya_Zol
5
Należy również pamiętać, że rozszerzenia plików, w tym .dlli .so, są bez znaczenia w systemie Linux. Są używane tylko dla naszej wygody.
code_dredd
1
@ray Czy potrafisz wyjaśnić? Myślałem, że nadal są standardem do przekazywania informacji o typach plików, a zatem nie są bez znaczenia?
FMaz
2
@FynnMazurkiewicz: To bardziej kwestia nieco odmiennych tradycji projektowych niż jednego centralnego atrybutu, który wymusza każdy system. W rzeczywistości zarówno jądro systemu Windows , jak i dynamiczny linker Linuksa z przyjemnością załadują bibliotekę współdzieloną (w odpowiednich formatach) bez względu na to, czy nazwa pliku kończy się na .dll, .so czy coś innego. Z przyczyn historycznych wywołanie systemowe LoadLibrary w systemie Windows w niektórych przypadkach dołącza „.dll” do nazwy pliku, jeśli nie ma jeszcze rozszerzenia, ale nie jest to tak zwykle używane .
Henning Makholm,
1
@ray niezupełnie: gccnie znajdzie dostarczonej biblioteki, takiej jak np. -lmjeśli jej nazwa pliku nie kończy się na .solub .ajej wersjach.
Ruslan
9

Te .dllpliki GameDataFolder/Managednależą do natywnego kodu programu, który używa Mono wewnętrznie.

Silnik gry Unity zawiera Mono (nawet na większości platform Windows).

Wieloplatformowe pliki wykonywalne i biblioteki współdzielone, które mogą być uruchamiane przez środowisko uruchomieniowe lub mono .NET Common Language, są często odpowiednio nazywane .exei .dllprzyrostki, nawet jeśli nie są specyficzne dla systemu Windows. Gdy znajdziesz .dllplik w programie dla systemu GNU / Linux, takiego jak Ubuntu, lub w dowolnym systemie operacyjnym innym niż Windows, zazwyczaj dzieje się tak. W większości przypadków znajdujesz się .dllw systemie Ubuntu, odpowiedź Golbotha to wyjaśnia. Ale nie do końca o to tu chodzi.

Silnik gry Unity - którego nie należy mylić z domyślnym interfejsem graficznym w większości wydań Ubuntu - jest popularnym, zastrzeżonym, wieloplatformowym silnikiem gier. Ten silnik nie działa na platformie .NET Framework lub Mono. Zamiast tego osadza Mono , co oznacza, że ​​Mono działa na nim. W ten sposób programiści piszą kod, którego potrzebuje ich gra, która nie jest już częścią silnika Unity.

Ogólnie rzecz biorąc, Mono można używać w taki sam sposób, jak zwykle używa się Microsoft .NET CLR Microsoftu, aby uruchamiać kompletne programy .NET / Mono. Ale Mono zostało zaprojektowane tak, aby można je było łatwo osadzać w natywnych aplikacjach kodu , w tym w celu umożliwienia dostosowania tych aplikacji . Tak dzieje się w opisywanej sytuacji. Pliki, które widzisz, nie należą do programu działającego bezpośrednio na Mono lub .NET CLR. Zamiast tego należą do programu natywnego kodu, który osadza Mono.

Jak silnik gry Unity wykorzystuje mono

Silnik gry Unity, napisany głównie w C ++, obsługuje własną instancję Mono, która nie używa - i może różnić się od - wersji (jeśli taka istnieje) zainstalowanej za pośrednictwem menedżera pakietów systemu. Tego osadzonego środowiska wykonawczego Mono nie można używać do uruchamiania samodzielnych programów .NET / Mono, ponieważ nie jest to jego celem. Zamiast tego natywna część kodu silnika używa go do uruchamiania kodu CIL. (CIL to Common Intermediate Language , który jest jego oficjalną nazwą. Poprzednio nazywał się MSIL lub Microsoft Intermediate Language, ponieważ Microsoft pierwotnie go opracował.) Programiści tworzący gry korzystające z silnika Unity zwykle piszą swój własny kod w C #, chociaż niektóre inne języki są obsługiwane.

Silnik Unity osadza Mono nawet w systemie Windows. W przypadku gier Universal Windows Platform - i żadnych innych platform - używa Microsoft .NET Framework zamiast Mono. Ale większość gier Unity na większości platform, w tym na większości urządzeń mobilnych i konsol do gier, a także Ubuntu i Windows, używa Mono. Na niektórych platformach IL2CPP jest dostępny jako alternatywa dla Mono, a na niektórych obsługiwany jest tylko IL2CPP. Zobacz ograniczenia dotyczące skryptów informacje zawiera temat dotyczące .

Inne sytuacje, w których możesz zobaczyć .dll pliki w systemie Ubuntu

Opisano dwie sytuacje, w których prawdopodobnie zobaczysz .dllplik na Ubuntu:

  1. Biblioteka współdzielona, ​​która ma być używana przez aplikację .NET / Mono. Odpowiedź Golbotha szczegółowo to opisuje. Właśnie to większość .dllzobaczysz w systemie Ubuntu. Po prostu tak się nie dzieje z .dllplikami w twoimGameDataFolder/Managed folderze.
  2. Plik dostarczający kod, który jest używany przez osadzone środowisko wykonawcze Mono w celu zapewnienia „skryptów” dla aplikacji kodu natywnego. Tak dzieje się w tym przypadku.

Istnieją dwa inne dość typowe przypadki, w których możesz zobaczyć .dllplik na Ubuntu:

  1. Kompilator .NET Core tworzy .dllpliki, a nie .exepliki, nawet jeśli to, co kompilujesz, nie jest biblioteką. Środowisko uruchomieniowe .NET Core (zwane CoreCLR), a nie zwykły .NET Framework lub Mono, uruchamia te pliki. .NET Core to produkt Microsoft, ale w przeciwieństwie do standardowego .NET Framework, .NET Core jest wieloplatformowy z oficjalną obsługą systemów GNU / Linux, takich jak Ubuntu, i jest darmowym oprogramowaniem typu open source .
  2. Czasami .dllplik, który widzisz na Ubuntu, będzie po prostu biblioteką Windows. Możesz to zobaczyć, jeśli program jest przechowywany w systemie Ubuntu, ale działa w systemie Windows lub jeśli podłączasz dysk Windows w Ubuntu. Możesz również zobaczyć to w połączeniu z programami, które można uruchomić na Ubuntu przy użyciu Wine , w tym oprogramowaniem dostarczanym z Wine lub instalowanym automatycznie w winetrickscelu obsługi innego oprogramowania Windows.

Nie jest to próba wyczerpującego przedstawienia wszystkich okoliczności, w których możesz napotkać .dllna Ubuntu. (Na przykład może to być również biblioteka OS / 2 ). Uważam jednak, że te cztery przypadki są najczęstsze.

Eliah Kagan
źródło