Différence entre le vin et le mono

31

Pour autant que je sache, Wine et Mono sont utilisés pour exécuter des applications Windows sous Ubuntu.

Je me demandais donc

  1. quelles sont leurs différences? S'agit-il de deux machines virtuelles? Ou appartient-il à une autre catégorie?
  2. Il vaut mieux quand l'utiliser pour quels types d'applications Windows? Par exemple, les applications qui peuvent nécessiter ou non .net Framework.
  3. Dépendent-ils les uns des autres? Doivent-ils être installés ensemble? Ou bien chacun fonctionne-t-il indépendamment sans existence de l'autre?

Merci et salutations!

Tim
la source

Réponses:

34

Pour exécuter un programme avec succès, trois éléments doivent correspondre:

  • Jeu d'instructions du processeur (par exemple x86 sur votre PC, ARM sur votre téléphone mobile, PowerPC sur certains Apple Mac, Java bytecode pour les applets Java, CLI pour les applications ".Net" / Mono)
  • Format de fichier binaire (par exemple, PE / COFF ".exe" pour Microsoft Windows, .jar pour les applets Java, PE32 ".exe", ELF sur Unix / Linux)
  • Interface de programmation d'application ; (Par exemple. POSIX sur Linux / Unix, Cocoa pour Mac OSX, Win32 sur Microsoft Windows, bibliothèque de classes de base pour les applications ".Net" / Mono).

Vous pouvez augmenter les chances de faire correspondre les trois en ayant des émulateurs / interprètes (pour les autres jeux d'instructions CPU), en ayant des chargeurs de fichiers supplémentaires (pour les formats de fichiers étrangers) et en ayant des bibliothèques de programmation supplémentaires fournissant plus d'API.

Notez également que certains processeurs peuvent exécuter nativement plusieurs jeux d'instructions; un PC a assez souvent des jeux d'instructions x86 et amd64 ; un processeur ARM peut en exécuter quatre: ARM32 / Thumb / Java bytecode / ThumbEE . Certains systèmes d'exploitation peuvent également fournir plusieurs API nativement (Microsoft Windows fournit Win32 et POSIX ).

Pour tout le reste, vous avez besoin d'un logiciel supplémentaire. Pour exécuter des programmes Java, vous avez besoin des trois parties énumérées ci-dessus pour le faire fonctionner: un programme Java Virtual Machine pour exécuter le bytecode; une façon de lancer des programmes Java et une bibliothèque de classes Java pour les programmes à appeler. "Java" est un nom de marque ici pour plusieurs technologies distinctes développées à l'origine par Sun, mais pour un utilisateur, elles sont souvent téléchargées comme une seule.

Il en va de même pour «.Net», qui est une marque commerciale pour plusieurs technologies différentes développées à l'origine par Microsoft: la bibliothèque Common Language Run-time / Base Class Library (CLR) est l'API; VES est le chargeur et Common Language Interface (CLI) est le jeu d'instructions.

Vous n'avez pas besoin de télécharger ces technologies de Microsoft, de Sun ou d'Intel simplement parce qu'ils ont à l'origine inventé quelque chose. AMD rend les processeurs compatibles avec les normes Intel; Apache ("Harmony") et Google ("Android Dalvik") font tous deux une suite de type Java; et Mono fournit une suite CLR / CLI / VES. L'important est que tout le monde utilise les mêmes normes, ce qui les rend compatibles. Un disque DVD sera lu sur n'importe quel lecteur DVD conforme à la norme, et une page Web HTML sera rendue dans n'importe quel navigateur Web répondant aux normes HTML.

  • Mono est une suite CLR / CLI / VES qui peut fonctionner sur Mac OSX, MS Windows et Linux.
  • Wine est une implémentation de l'API Win32 qui peut s'exécuter sur Mac OSX, MS Windows et Linux.
  • Vous pouvez exécuter Mono sur Wine , sur n'importe quel système d'exploitation.
  • Vous pouvez exécuter Wine sur Qemu , sur n'importe quelle architecture CPU.

Ainsi , Mono fait des applications de CLR exécuter et vin rend les applications Win32 exécutées. La seule chose en commun est que les noms de fichiers se terminent par ".exe"; le contenu est complètement différent et incompatible, vous avez donc besoin du bon .

Tout comme un interpréteur Python affichera une erreur lorsqu'il sera présenté avec Perl (et vice versa), un interpréteur CLR générera une erreur lorsqu'il sera présenté avec x86 + Win32 ou JVM + Java bytecode. Si vous pouvez publier un lien vers le programme particulier que vous souhaitez exécuter, moi-même ou quelqu'un d'autre devrait être en mesure de vous dire le jeu d'instructions exact, le format de fichier et l'API pour lesquels il a été conçu, et ce que vous devez installer sur Linux pour l'exécuter. J'espère que ça t'as aidé!

(Parfois, vous pourriez même avoir besoin des deux. Par exemple, le simulateur de train Openbve est C # et compilé en PE / COFF + CLI + CLR, mais peut éventuellement utiliser des plugins binaires C compilés pour PE / COFF + Win32 + x86. Dans ce cas, vous besoin d'une version Win32 de Mono sous Wine. Si l'architecture du CPU est également différente, il faudrait l'émuler, donc Mono sous Wine sous Qemu).

sladen
la source
22

La réponse courte:

.NET est la réponse de Microsoft à Java, et Mono en est une implémentation open source. Wine est destiné aux exes natifs et n'a rien à voir avec Mono, sauf que vous pouvez peut-être exécuter le runtime .NET avec lui, comme tout autre logiciel Windows natif.


La réponse longue:

Pour comprendre la différence entre Wine et Mono (et .NET), vous devez comprendre la différence entre les exécutables de code machine natifs et les exécutables "Common Language Runtime" aka "Virtual Machine":

Les exécutables de code machine natifs utilisent des codes d'instructions spécifiques à votre processeur et sont directement exécutés par celui-ci. Cela signifie qu'ils doivent être recompilés pour différents processeurs. Wine est capable d'exécuter des exécutables de code machine natif pour Windows en exécutant directement ce code exécutable et en interceptant tous les appels de bibliothèque qu'il effectue, en les redirigeant vers sa propre implémentation de l'API Win32.

Les exécutables "CLR" ou "VM" ne sont pas spécifiques à un processeur: ils ont besoin d'un logiciel supplémentaire pour permettre au processeur de les exécuter. Mono / .NET est un exemple de ce type de système. Les programmes .NET nécessitent que le runtime .NET soit installé même lorsque vous les exécutez sous Windows. Java fonctionne de la même manière.

Alors:

1) la différence entre Wine et Mono: Wine sert à exécuter des exécutables de code machine natifs conçus pour Windows, et Mono à exécuter des exécutables Mono / .NET qui ne sont pas nécessairement créés pour une plate-forme spécifique. Installer Mono sur Linux équivaut à installer le runtime .NET sur Windows.

2) Si le programme que vous souhaitez exécuter n'utilise pas du tout .NET, vous devez utiliser Wine. Mono ne vous aidera pas du tout ici.

Cependant, si le programme utilise .NET, vous avez deux options, qui peuvent ou non fonctionner:

  • Vous pouvez essayer de l'exécuter en utilisant Mono. Cela échouera si le programme .NET utilise également des fonctions natives de l'API win32, ce que font beaucoup (mais pas toutes) les applications .NET conçues pour Windows.

  • Vous pouvez également installer le runtime Microsoft .NET pour Windows dans Wine, puis exécuter l'application .NET à travers celui-ci. Dans ce cas, vous n'utiliserez pas du tout Mono.

3) Wine et Mono ne dépendent pas du tout, mais comme indiqué ci-dessus, vous pouvez utiliser le runtime Microsoft .NET dans Wine pour exécuter des applications Mono / .NET.

Alistair Buxton
la source
Merci! (1) Donc, si une application dépend à la fois de .NET et de win32, la seule façon est d'installer .NET sur Wine puis d'installer l'application sur Wine? (2) Comment savoir si une application s'appuie sur .NET et / ou win32?
Tim
1
La saisie file *.exeaffiche des informations sur le jeu d'instructions CPU et le type de fichier. S'il s'agit d'une application CLI / CLR (".Net" / Mono) qui utilise également des appels API Win32 natifs, vous devrez l'exécuter ou rechercher tous les file *.dllfichiers qui apparaissent comme étant natifs x86 + Win32.
sladen
Vous pouvez également installer Mono pour Windows dans Wine, mais selon la FAQ Wine, il est moins susceptible de fonctionner que le runtime .NET. Il n'y a pas de moyen simple de savoir si un programme .NET utilise des appels natifs win32, car il existe différentes façons de le faire. La meilleure chose à faire est d'essayer d'abord Mono, si cela ne fonctionne pas, essayez Wine + .NET.
Alistair Buxton