Różnica między winem a mono

31

O ile mi wiadomo, zarówno Wine, jak i Mono są używane do uruchamiania aplikacji Windows w systemie Ubuntu.

Zastanawiałem się

  1. jakie są ich różnice? Czy oba są maszynami wirtualnymi? Czy może każda z nich należy do innej kategorii?
  2. Lepiej kiedy używać, dla jakich aplikacji Windows? Na przykład aplikacje, które mogą wymagać .NET Framework.
  3. Czy są od siebie zależni? Czy muszą być instalowane razem? Czy każde działa niezależnie, bez istnienia drugiego?

Dziękuję i pozdrawiam!

Tim
źródło

Odpowiedzi:

34

Pomyślne uruchomienie programu wymaga, aby trzy rzeczy pasowały:

  • Zestaw instrukcji procesora (np. X86 w komputerze, ARM w telefonie komórkowym, PowerPC w niektórych komputerach Apple Mac, kod bajtowy Java dla apletów Java, CLI dla aplikacji „.Net” / Mono)
  • Format pliku binarnego (np. PE / COFF „.exe” dla systemu Microsoft Windows, .jar dla apletów Java, PE32 „.exe”, ELF na systemach Unix / Linux)
  • Interfejs programowania aplikacji ; (Np. POSIX w systemie Linux / Unix, Cocoa w systemie Mac OSX, Win32 w systemie Microsoft Windows, Biblioteka klas podstawowych dla aplikacji „.Net” / Mono).

Możesz zwiększyć szansę na dopasowanie wszystkich trzech przez posiadanie emulatorów / interpretatorów (dla innych zestawów instrukcji procesora), poprzez dodatkowe programy ładujące pliki (dla obcych formatów plików) oraz dodatkowe biblioteki programistyczne zapewniające więcej interfejsów API.

Zauważ też, że niektóre procesory mogą natywnie wykonywać więcej niż jeden zestaw instrukcji; komputer dość często ma zestawy instrukcji x86 i amd64 ; ARM procesor może wykonać cztery: arm32 / Thumb / kodu bajtowego Java / ThumbEE . Niektóre systemy operacyjne mogą również dostarczać więcej niż jeden interfejs API natywnie (Microsoft Windows zapewnia Win32 i POSIX ).

Do wszystkiego innego potrzebujesz dodatkowego oprogramowania. Do uruchomienia programów Java potrzebne są trzy części wymienione powyżej, aby działało: program Java Virtual Machine do uruchamiania kodu bajtowego; sposób uruchamiania programów Java oraz bibliotekę klas Java dla tych programów. „Java” jest tutaj marką kilku oddzielnych technologii pierwotnie opracowanych przez Sun, ale dla użytkownika są one często pobierane jako jedna.

To samo dotyczy „.Net”, który jest marką marketingową dla kilku różnych technologii pierwotnie opracowanych przez Microsoft: Common Run-run Run / Base Class Library (CLR) to API; VES to moduł ładujący, a zestaw instrukcji to Common Language Interface (CLI).

Nie musisz pobierać tych technologii z Microsoft, Sun lub Intel, ponieważ pierwotnie coś wymyślili. AMD zapewnia zgodność procesorów ze standardami Intela; oba Apache („Harmony”) i Google („Android Dalvik”) tworzą pakiet podobny do Java; a Mono zapewnia pakiet CLR / CLI / VES. Ważne jest to, że wszyscy stosują te same standardy, dzięki czemu są kompatybilne. Dysk DVD będzie odtwarzany na dowolnym odtwarzaczu DVD, który spełnia ten standard, a strona HTML będzie renderowana w dowolnej przeglądarce internetowej spełniającej standardy HTML.

  • Mono to pakiet CLR / CLI / VES, który może działać na Mac OSX, MS Windows i Linux.
  • Wine jest implementacją Win32 API, która może działać na Mac OSX, MS Windows i Linux.
  • Możesz uruchomić Mono na Wine , na dowolnym systemie operacyjnym.
  • Możesz uruchomić Wine na Qemu , na dowolnej architekturze procesora.

Tak więc Mono uruchamia aplikacje CLR .exe, a Wine uruchamia aplikacje Win32 .exe. Jedyną wspólną cechą jest to, że nazwy plików kończą się na „.exe”; zawartość jest zupełnie inna i niekompatybilna, więc potrzebujesz odpowiedniej .

Podobnie jak interpreter języka Python wystąpi błąd, gdy zostanie zaprezentowany w Perlu (i na odwrót), interpreter języka CLR wystąpi błąd, gdy zostanie zaprezentowany z kodem bajtowym x86 + Win32 lub JVM + Java. Jeśli możesz opublikować link do konkretnego programu, który chcesz uruchomić, ja lub ktoś inny powinien być w stanie powiedzieć ci dokładny zestaw instrukcji, format pliku i interfejs API, dla którego został zaprojektowany, i co musisz zainstalować w systemie Linux uruchomić. Mam nadzieję, że to pomaga!

(Czasami możesz potrzebować nawet obu. Na przykład symulator pociągu Openbve to C # i skompilowany do PE / COFF + CLI + CLR, ale opcjonalnie możesz użyć wtyczek binarnych C skompilowanych dla PE / COFF + Win32 + x86. W takim przypadku możesz potrzebuję wersji Win32 Mono pod Wine. Jeśli architektura procesora jest również inna, wymagałoby to emulacji; więc Mono pod Wine pod Qemu).

sladen
źródło
22

Krótka odpowiedź:

.NET to odpowiedź Microsoftu na Javę, a Mono jest jego implementacją typu open source. Wine jest dla natywnych ex i nie ma nic wspólnego z Mono poza tym, że możesz uruchomić z nim środowisko uruchomieniowe .NET, jak każde inne rodzime oprogramowanie Windows.


Długa odpowiedź:

Aby zrozumieć różnicę między Wine a Mono (i .NET), musisz zrozumieć różnicę między natywnymi plikami wykonywalnymi kodu maszynowego a plikami wykonywalnymi „wspólnego języka”, czyli plików wykonywalnych „maszyny wirtualnej”:

Natywne pliki wykonywalne kodu maszynowego używają kodów instrukcji specyficznych dla twojego procesora i są przez niego bezpośrednio wykonywane. Oznacza to, że należy je ponownie skompilować dla różnych procesorów. Wine jest w stanie uruchamiać natywne pliki wykonywalne kodu maszynowego dla systemu Windows, bezpośrednio uruchamiając ten kod wykonywalny i przechwytując wywołania bibliotek, które przekierowuje do własnej implementacji Win32 API.

Pliki wykonywalne „CLR” lub „VM” nie są specyficzne dla jednego procesora: Potrzebują dodatkowego oprogramowania, aby procesor mógł je uruchomić. Mono / .NET jest jednym z takich przykładów tego rodzaju systemu. Programy .NET wymagają zainstalowanego środowiska wykonawczego .NET, nawet jeśli są uruchamiane w systemie Windows. Java działa w ten sam sposób.

Więc:

1) różnica między Wine a Mono: Wine służy do uruchamiania natywnych plików wykonywalnych kodu maszynowego wykonanych dla systemu Windows, a Mono służy do uruchamiania plików wykonywalnych Mono / .NET, które niekoniecznie są tworzone na konkretnej platformie. Zainstalowanie Mono w systemie Linux jest równoważne z zainstalowaniem środowiska uruchomieniowego .NET w systemie Windows.

2) Jeśli program, który chcesz uruchomić, w ogóle nie korzysta z .NET, musisz użyć Wine. Mono w ogóle ci tu nie pomoże.

Jeśli jednak program korzysta z platformy .NET, masz dwie opcje, z których każda może działać lub nie:

  • Możesz spróbować uruchomić go za pomocą Mono. Nie powiedzie się to, jeśli program .NET będzie również używał funkcji rodzimych z interfejsu API win32, co robi wiele (ale nie wszystkie) aplikacje .NET stworzone dla systemu Windows.

  • Alternatywnie możesz zainstalować środowisko uruchomieniowe Microsoft .NET dla systemu Windows wewnątrz Wine, a następnie uruchomić przez niego aplikację .NET. W tym przypadku w ogóle nie będziesz używać Mono.

3) Wine i Mono w ogóle nie zależą od siebie, ale jak wspomniano powyżej, można używać środowiska uruchomieniowego Microsoft .NET w Wine do uruchamiania aplikacji Mono / .NET.

Alistair Buxton
źródło
Dzięki! (1) Więc jeśli aplikacja zależy zarówno od .NET, jak i win32, jedynym sposobem jest zainstalowanie .NET na Wine, a następnie zainstalowanie aplikacji na Wine? (2) Jak sprawdzić, czy aplikacja opiera się na .NET i / lub win32?
Tim
1
Wpisanie file *.exepokaże informacje o zestawie instrukcji procesora i typie pliku. Jeśli jest to aplikacja CLI / CLR („.Net” / Mono), która również korzysta z rodzimych wywołań interfejsu API Win32, musisz go uruchomić lub poszukać file *.dllplików, które pokazują, że są rodzime x86 + Win32.
sladen
Możesz również zainstalować Mono dla Windows w Wine, ale zgodnie z FAQ Wine, jest mniej prawdopodobne, że będzie działać niż środowisko uruchomieniowe .NET. Nie ma prostego sposobu, aby dowiedzieć się, czy program .NET używa natywnych wywołań win32, ponieważ istnieje wiele różnych sposobów, w jaki można to zrobić. Najlepiej wypróbuj najpierw Mono, jeśli nie działa, wypróbuj Wine + .NET.
Alistair Buxton