Differenza tra vino e mono


31

Per quanto ne so, sia Wine che Mono sono utilizzati per eseguire applicazioni Windows su Ubuntu.

Quindi mi chiedevo

  1. quali sono le loro differenze? Sono entrambe macchine virtuali? O ognuno appartiene a qualche altra categoria?
  2. È meglio quando utilizzare quali per quali tipi di applicazioni Windows? Ad esempio, quelle applicazioni che possono o meno richiedere .net Framework.
  3. Dipendono l'uno dall'altro? Sono tenuti a installare insieme? O ciascuno funziona indipendentemente senza l'esistenza dell'altro?

Grazie e saluti!

Risposte:


34

L'esecuzione corretta di un programma richiede che tre elementi corrispondano:

  • Set di istruzioni CPU (ad es. X86 nel PC, ARM nel telefono cellulare, PowerPC in alcuni Mac Apple, bytecode Java per applet Java, CLI per applicazioni ".Net" / Mono)
  • Formato file binario (es. PE / COFF ".exe" per Microsoft Windows, .jar per applet Java, PE32 ".exe", ELF su Unix / Linux)
  • Interfaccia di programmazione dell'applicazione ; (Ad esempio POSIX su Linux / Unix, Cocoa per Mac OSX, Win32 su Microsoft Windows, Libreria di classi base per applicazioni ".Net" / Mono).

Puoi aumentare la possibilità di trovare una corrispondenza tra tutti e tre disponendo di emulatori / interpreti (per altri set di istruzioni della CPU), caricatori di file aggiuntivi (per formati di file esterni) e librerie di programmazione aggiuntive che forniscono più API.

Si noti inoltre che alcuni processori possono eseguire nativamente più di un set di istruzioni; un PC abbastanza spesso ha set di istruzioni x86 e amd64 ; un processore ARM può eseguirne quattro: ARM32 / Thumb / Java bytecode / ThumbEE . Alcuni sistemi operativi possono fornire anche più di un'API in modo nativo (Microsoft Windows fornisce Win32 e POSIX ).

Per tutto il resto è necessario un software aggiuntivo. Per eseguire i programmi Java sono necessarie le tre parti sopra elencate per farlo funzionare: un programma Java Virtual Machine da eseguire il bytecode; un modo per avviare programmi Java e un Classlibrary Java per i programmi da chiamare. "Java" è un marchio qui per diverse tecnologie separate originariamente sviluppate da Sun, ma per un utente vengono spesso scaricate come una sola.

Lo stesso vale per ".Net", che è un marchio commerciale per diverse tecnologie originariamente sviluppate da Microsoft: l'API Common Language Run-time / Base Class Library (CLR); VES è il caricatore e Common Language Interface (CLI) è il set di istruzioni.

Non è necessario scaricare tali tecnologie da Microsoft, da Sun o da Intel solo perché hanno originariamente inventato qualcosa. AMD rende i processori compatibili con gli standard Intel; sia Apache ("Harmony") che Google ("Android Dalvik") creano entrambi una suite simile a Java; e Mono fornisce una suite CLR / CLI / VES. L'importante è che tutti utilizzino gli stessi standard, rendendoli compatibili. Un disco DVD verrà riprodotto su qualsiasi lettore DVD che soddisfa lo standard e una pagina Web HTML verrà visualizzata in qualsiasi browser Web conforme agli standard HTML.

  • Mono è una suite CLR / CLI / VES che può essere eseguita su Mac OSX, MS Windows e Linux.
  • Vino è un'implementazione dell'API Win32 che può essere eseguita su Mac OSX, MS Windows e Linux.
  • Puoi eseguire Mono su Wine , su qualsiasi sistema operativo.
  • Puoi eseguire Wine su Qemu , su qualsiasi architettura CPU.

Quindi Mono fa funzionare le applicazioni CLR .exe e Wine fa funzionare le applicazioni Win32 .exe. L'unica cosa in comune è che i nomi dei file terminano in ".exe"; i contenuti sono completamente diversi e incompatibili, quindi hai bisogno di quello giusto .

Proprio come un interprete Python si guasta quando viene presentato con Perl (e viceversa), un interprete CLR si guasta quando viene presentato con x86 + Win32 o JVM + Java bytecode. Se puoi pubblicare un link al particolare programma che desideri eseguire, io stesso o qualcun altro dovresti essere in grado di dirti il ​​set esatto di istruzioni, il formato del file e l'API per cui è stato progettato e cosa devi installare su Linux per eseguirlo. Spero che sia d'aiuto!

(A volte potresti persino aver bisogno di entrambi. Ad esempio, il simulatore di treni Openbve è C # e compilato in PE / COFF + CLI + CLR, ma può facoltativamente utilizzare plugin binari C compilati per PE / COFF + Win32 + x86. In questo caso, tu serve una versione Win32 di Mono in Wine. Se anche l'architettura della CPU è diversa, dovrebbe essere emulata, quindi Mono in Wine in Qemu).


22

La breve risposta:

.NET è la risposta di Microsoft a Java e Mono ne è un'implementazione open source. Wine è per ex nativi e non ha nulla a che fare con Mono, tranne per il fatto che è possibile eseguire il runtime .NET con esso, come qualsiasi altro software Windows nativo.


La lunga risposta:

Per comprendere la differenza tra Wine e Mono (e .NET) è necessario comprendere la differenza tra eseguibili con codice macchina nativo ed eseguibili "Common Language Runtime", ovvero "macchina virtuale":

Gli eseguibili con codice macchina nativo usano codici di istruzione specifici per il tuo processore e vengono eseguiti direttamente da esso. Ciò significa che devono essere ricompilati per processori diversi. Wine è in grado di eseguire eseguibili di codice macchina nativo per Windows eseguendo direttamente questo codice eseguibile e intercettando tutte le chiamate alla libreria che effettua, reindirizzandole alla propria implementazione dell'API Win32.

Gli eseguibili "CLR" o "VM" non sono specifici di un processore: hanno bisogno di un software aggiuntivo per consentire al processore di eseguirli. Mono / .NET è un esempio di questo tipo di sistema. I programmi .NET richiedono il runtime .NET installato anche quando li esegui su Windows. Java funziona allo stesso modo.

Così:

1) la differenza tra Wine e Mono: Wine è per l'esecuzione di eseguibili di codice macchina nativi realizzati per Windows e Mono è per l'esecuzione di eseguibili Mono / .NET che non sono necessariamente realizzati per nessuna piattaforma specifica. L'installazione di Mono su Linux equivale all'installazione del runtime .NET su Windows.

2) Se il programma che si desidera eseguire non utilizza .NET, è necessario utilizzare Wine. Mono non ti aiuterà affatto qui.

Tuttavia, se il programma utilizza .NET, sono disponibili due opzioni, una delle quali può funzionare o meno:

  • Puoi provare a eseguirlo usando Mono. Ciò non funzionerà se il programma .NET utilizza anche funzioni native dell'API win32, come fanno molte (ma non tutte) le applicazioni .NET create per Windows.

  • In alternativa, è possibile installare il runtime di Microsoft .NET per Windows all'interno di Wine e quindi eseguire l'applicazione .NET tramite esso. In questo caso non utilizzerai affatto Mono.

3) Wine e Mono non dipendono affatto l'uno dall'altro, ma come detto sopra, è possibile utilizzare il runtime di Microsoft .NET in Wine per eseguire applicazioni Mono / .NET.


Grazie! (1) Quindi se un'applicazione dipende sia da .NET sia da win32, l'unico modo è installare .NET su Wine e quindi installare l'applicazione su Wine? (2) Come sapere se un'applicazione si basa su .NET e / o win32?
Tim

1
La digitazione file *.exemostrerà informazioni sul set di istruzioni della CPU e sul tipo di file. Se si tratta di un'applicazione CLI / CLR (".Net" / Mono) che utilizza anche chiamate API Win32 native, sarà necessario eseguirla o cercare tutti i file *.dllfile che mostrano che sono nativi x86 + Win32.
sladen,

Puoi anche installare Mono per Windows in Wine ma secondo le FAQ di Wine è meno probabile che funzioni in runtime .NET. Non esiste un modo semplice per sapere se un programma .NET utilizza chiamate Win32 native poiché esistono diversi modi per farlo. La cosa migliore da fare è provare prima Mono, se non funziona, prova Wine + .NET.
Alistair Buxton,
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.