Unterschied zwischen Wein und Mono

31

Soweit ich weiß, werden sowohl Wine als auch Mono verwendet, um Windows-Anwendungen unter Ubuntu auszuführen.

Also habe ich mich gefragt

  1. Was sind ihre Unterschiede? Sind sie beide virtuelle Maschinen? Oder gehört jeder zu einer anderen Kategorie?
  2. Es ist besser, wann welche für welche Arten von Windows-Anwendungen zu verwenden? Beispielsweise solche Anwendungen, für die .net Framework erforderlich ist oder nicht.
  3. Sind sie voneinander abhängig? Müssen sie zusammen installiert werden? Oder arbeitet jeder für sich, ohne dass der andere existiert?

Danke und Grüße!

Tim
quelle

Antworten:

34

Das erfolgreiche Ausführen eines Programms setzt voraus, dass drei Dinge übereinstimmen:

  • CPU-Befehlssatz (z. B. x86 in Ihrem PC, ARM in Ihrem Mobiltelefon, PowerPC in einigen Apple Macs, Java-Bytecode für Java-Applets, CLI für ".Net" / Mono-Anwendungen)
  • Binärdateiformat (z. B. PE / COFF ".exe" für Microsoft Windows, .jar für Java-Applets, PE32 ".exe", ELF unter Unix / Linux)
  • Anwendungsprogrammierschnittstelle ; (ZB POSIX unter Linux / Unix, Cocoa für Mac OSX, Win32 unter Microsoft Windows, Basisklassenbibliothek für ".Net" / Mono-Anwendungen).

Sie können die Wahrscheinlichkeit der Übereinstimmung aller drei erhöhen, indem Sie Emulatoren / Interpreter (für andere CPU-Befehlssätze), zusätzliche Dateilader (für fremde Dateiformate) und zusätzliche Programmierbibliotheken mit mehr APIs verwenden.

Beachten Sie auch, dass einige Prozessoren nativ mehr als einen Befehlssatz ausführen können. Ein PC verfügt häufig über x86- und amd64- Befehlssätze. Ein ARM- Prozessor kann vier ausführen: ARM32 / Thumb / Java-Bytecode / ThumbEE . Einige Betriebssysteme können auch mehrere APIs nativ bereitstellen (Microsoft Windows stellt Win32 und POSIX bereit ).

Für alles andere benötigen Sie zusätzliche Software. Zum Ausführen von Java-Programmen benötigen Sie die drei oben aufgeführten Teile, damit es funktioniert: ein Java Virtual Machine-Programm zum Ausführen des Bytecodes; eine Möglichkeit, Java-Programme zu starten, und eine Java-Klassenbibliothek, die die Programme aufrufen können. "Java" ist hier ein Markenname für mehrere separate Technologien, die ursprünglich von Sun entwickelt wurden, aber für einen Benutzer werden sie oft als eine heruntergeladen.

Gleiches gilt für ".Net", ein Marketing-Markenname für verschiedene Technologien, die ursprünglich von Microsoft entwickelt wurden: Die Common Language Run-Time / Base Class Library (CLR) ist die API. VES ist der Loader und Common Language Interface (CLI) ist der Befehlssatz.

Sie müssen diese Technologien nicht von Microsoft, Sun oder Intel herunterladen, nur weil sie ursprünglich etwas erfunden haben. AMD macht Prozessoren kompatibel mit Intels Standards; Sowohl Apache ("Harmony") als auch Google ("Android Dalvik") bilden eine Java-ähnliche Suite. und Mono bietet eine CLR / CLI / VES-Suite. Wichtig ist, dass alle die gleichen Standards verwenden und damit kompatibel sind. Eine DVD wird auf jedem DVD-Player abgespielt, der dem Standard entspricht, und eine HTML-Webseite wird in jedem Webbrowser gerendert, der den HTML-Standards entspricht.

  • Mono ist eine CLR / CLI / VES-Suite, die unter Mac OSX, MS Windows und Linux ausgeführt werden kann.
  • Wine ist eine Win32-API-Implementierung, die unter Mac OS X, MS Windows und Linux ausgeführt werden kann.
  • Sie können Mono auf Wine und auf jedem Betriebssystem ausführen.
  • Sie können Wine auf Qemu und auf jeder CPU-Architektur ausführen .

So lässt Mono CLR .exe-Anwendungen ausführen, und Wine lässt Win32 .exe-Anwendungen ausführen. Das Einzige, was gemeinsam ist, ist, dass die Dateinamen auf ".exe" enden. die inhalte sind völlig unterschiedlich und inkompatibel, also brauchst du die richtige .

Genauso wie ein Python-Interpreter bei der Darstellung mit Perl (und umgekehrt) einen Fehler verursacht, tritt bei der Darstellung eines CLR-Interpreters mit x86 + Win32- oder JVM + Java-Bytecode ein Fehler auf. Wenn Sie einen Link zu dem bestimmten Programm veröffentlichen können, das Sie ausführen möchten, sollten Sie selbst oder eine andere Person in der Lage sein, den genauen Befehlssatz, das Dateiformat und die API, für die es entwickelt wurde, sowie die für die Installation unter Linux erforderlichen Informationen anzugeben es laufen zu lassen. Hoffentlich hilft das!

(Manchmal benötigen Sie sogar beides. Beispielsweise ist der Openbve -Zugsimulator C # und wurde in PE / COFF + CLI + CLR kompiliert, kann aber optional C-Binär-Plugins verwenden, die für PE / COFF + Win32 + x86 kompiliert wurden. In diesem Fall haben Sie brauche eine Win32-Version von Mono unter Wine. Wenn die CPU-Architektur auch anders ist, müsste das emuliert werden; also Mono unter Wine unter Qemu).

sladen
quelle
22

Die kurze Antwort:

.NET ist die Antwort von Microsoft auf Java, und Mono ist eine Open-Source-Implementierung davon. Wine ist für native Exes und hat nichts mit Mono zu tun, außer dass Sie möglicherweise die .NET-Laufzeitumgebung damit ausführen können, wie jede andere native Windows-Software.


Die lange Antwort:

Um den Unterschied zwischen Wine und Mono (und .NET) zu verstehen, müssen Sie den Unterschied zwischen ausführbaren Dateien für systemeigenen Maschinencode und ausführbaren Dateien für "Common Language Runtime" (auch "virtuelle Maschine" genannt) verstehen:

Programmdateien mit systemeigenem Maschinencode verwenden für Ihren Prozessor spezifische Anweisungscodes und werden direkt von diesem ausgeführt. Das heißt, sie müssen für verschiedene Prozessoren neu kompiliert werden. Wine ist in der Lage, native ausführbare Maschinencode-Dateien für Windows auszuführen, indem dieser ausführbare Code direkt ausgeführt wird und alle von ihm ausgeführten Bibliotheksaufrufe abgefangen und an die eigene Implementierung der Win32-API umgeleitet werden.

Die ausführbaren Dateien "CLR" oder "VM" sind nicht prozessorspezifisch: Sie benötigen eine zusätzliche Software, damit der Prozessor sie ausführen kann. Mono / .NET ist ein solches Beispiel für ein solches System. Bei .NET-Programmen muss die .NET-Laufzeit installiert sein, auch wenn Sie sie unter Windows ausführen. Java funktioniert genauso.

So:

1) Der Unterschied zwischen Wine und Mono: Wine dient zum Ausführen von für Windows erstellten ausführbaren Dateien für systemeigenen Computercode, und Mono dient zum Ausführen von ausführbaren Dateien für Mono / .NET, die nicht unbedingt für eine bestimmte Plattform erstellt wurden. Die Installation von Mono unter Linux entspricht der Installation der .NET-Laufzeit unter Windows.

2) Wenn das Programm, das Sie ausführen möchten, .NET überhaupt nicht verwendet, müssen Sie Wine verwenden. Mono wird dir hier überhaupt nicht helfen.

Wenn das Programm jedoch .NET verwendet, stehen Ihnen zwei Optionen zur Verfügung, die entweder funktionieren oder nicht:

  • Sie können versuchen, es mit Mono auszuführen. Dies schlägt fehl, wenn das .NET-Programm auch native Funktionen aus der Win32-API verwendet, die viele (aber nicht alle) .NET-Anwendungen für Windows ausführen.

  • Alternativ können Sie die Microsoft .NET-Laufzeit für Windows in Wine installieren und dann die .NET-Anwendung über Wine ausführen. In diesem Fall wird Mono überhaupt nicht verwendet.

3) Wine und Mono hängen überhaupt nicht voneinander ab, aber wie oben angegeben, können Sie die Microsoft .NET-Laufzeit in Wine verwenden, um Mono / .NET-Anwendungen auszuführen.

Alistair Buxton
quelle
Vielen Dank! (1) Wenn eine Anwendung sowohl von .NET als auch von win32 abhängt, besteht die einzige Möglichkeit darin, .NET unter Wine und anschließend die Anwendung unter Wine zu installieren. (2) Woran erkenne ich, ob eine Anwendung auf .NET und / oder Win32 basiert?
Tim
1
Beim Tippen file *.exewerden Informationen zum CPU-Befehlssatz und zum Dateityp angezeigt. Wenn es sich um eine CLI / CLR-Anwendung (".Net" / Mono) handelt, die auch native Win32-API-Aufrufe verwendet, müssen Sie sie ausführen oder nach file *.dllDateien suchen , die als native x86 + Win32-Dateien angezeigt werden.
Sladen
Sie können Mono für Windows auch in Wine installieren, laut den Wine-FAQ ist es jedoch weniger wahrscheinlich, dass es funktioniert als die .NET-Laufzeit. Es gibt keine einfache Möglichkeit, festzustellen, ob ein .NET-Programm systemeigene Win32-Aufrufe verwendet, da es verschiedene Möglichkeiten gibt, dies zu tun. Am besten probieren Sie zuerst Mono aus. Wenn dies nicht funktioniert, probieren Sie Wine + .NET aus.
Alistair Buxton