Diferencia entre vino y mono

31

Hasta donde yo sé, tanto Wine como Mono se usan para ejecutar aplicaciones de Windows en Ubuntu.

Entonces me preguntaba

  1. ¿Cuáles son sus diferencias? ¿Son ambas máquinas virtuales? ¿O cada uno pertenece a alguna otra categoría?
  2. Es mejor ¿Cuándo usar qué para qué tipo de aplicaciones de Windows? Por ejemplo, aquellas aplicaciones que pueden o no requerir .net Framework.
  3. ¿Dependen unos de otros? ¿Están obligados a instalar juntos? ¿O cada uno trabaja independientemente sin la existencia del otro?

¡Gracias y saludos!

Tim
fuente

Respuestas:

34

La ejecución exitosa de un programa requiere que coincidan tres cosas:

  • Conjunto de instrucciones de CPU (por ejemplo, x86 en su PC, ARM en su teléfono móvil, PowerPC en algunos Apple Macs, código de bytes Java para Applets Java, CLI para aplicaciones ".Net" / Mono)
  • Formato de archivo binario (por ejemplo, PE / COFF ".exe" para Microsoft Windows, .jar para Applets Java, PE32 ".exe", ELF en Unix / Linux)
  • Interfaz de programación de aplicaciones ; (Por ejemplo, POSIX en Linux / Unix, Cocoa para Mac OSX, Win32 en Microsoft Windows, Biblioteca de clase base para aplicaciones ".Net" / Mono).

Puede aumentar la posibilidad de hacer coincidir los tres al tener emuladores / intérpretes (para otros conjuntos de instrucciones de CPU), al tener cargadores de archivos adicionales (para formatos de archivo extranjeros) y al tener bibliotecas de programación adicionales que proporcionan más API.

Tenga en cuenta también que algunos procesadores pueden ejecutar de forma nativa más de un conjunto de instrucciones; una PC a menudo tiene conjuntos de instrucciones x86 y amd64 ; un procesador ARM puede ejecutar cuatro: ARM32 / Thumb / Java bytecode / ThumbEE . Algunos sistemas operativos también pueden proporcionar más de una API de forma nativa (Microsoft Windows proporciona Win32 y POSIX ).

Para todo lo demás, necesita software adicional. Para ejecutar programas Java, necesita las tres partes enumeradas anteriormente para que funcione: un programa Java Virtual Machine para ejecutar el código de bytes; una forma de iniciar programas Java y una biblioteca de clases Java para que los programas llamen. "Java" es una marca aquí para varias tecnologías separadas desarrolladas originalmente por Sun, pero para un usuario a menudo se descargan como una sola.

Lo mismo se aplica para ".Net", que es una marca comercial de varias tecnologías diferentes desarrolladas originalmente por Microsoft: La Biblioteca de clase de lenguaje común / CLR ( Common Language Run-time / Base Class Library ) son las API; VES es el cargador y Common Language Interface (CLI) es el conjunto de instrucciones.

No tiene que descargar esas tecnologías de Microsoft, de Sun o de Intel solo porque originalmente inventaron algo. AMD hace que los procesadores sean compatibles con los estándares de Intel; tanto Apache ("Harmony") como Google ("Android Dalvik") hacen una suite similar a Java; y Mono proporciona una suite CLR / CLI / VES. Lo importante es que todos usen los mismos estándares, haciéndolos compatibles. Se reproducirá un disco DVD en cualquier reproductor de DVD que cumpla con el estándar, y una página web HTML se reproducirá en cualquier navegador web que cumpla con los estándares HTML.

  • Mono es una suite CLR / CLI / VES que puede ejecutarse en Mac OSX, MS Windows y Linux.
  • Wine es una implementación de la API Win32 que puede ejecutarse en Mac OSX, MS Windows y Linux.
  • Puede ejecutar Mono sobre Wine , sobre cualquier sistema operativo.
  • Puede ejecutar Wine sobre Qemu , sobre cualquier arquitectura de CPU.

Entonces Mono hace que se ejecuten las aplicaciones .exe de CLR, y Wine hace que se ejecuten las aplicaciones .exe de Win32. Lo único en común es que los nombres de los archivos terminan en ".exe"; los contenidos son completamente diferentes e incompatibles, por lo que necesita el correcto .

Al igual que un intérprete de Python producirá un error cuando se presente con Perl (y viceversa), un intérprete de CLR producirá un error cuando se presente con x86 + Win32 o JVM + código de bytes Java. Si puede publicar un enlace al programa en particular que desea ejecutar, yo o alguien más debería poder decirle el conjunto de instrucciones, el formato de archivo y la API exactos para los que fue diseñado, y lo que necesita instalar en Linux para ejecutarlo ¡Espero que ayude!

(A veces puede que necesite ambos. Por ejemplo, el simulador de tren Openbve es C # y está compilado para PE / COFF + CLI + CLR, pero opcionalmente puede usar complementos binarios C compilados para PE / COFF + Win32 + x86. En este caso, usted necesita una versión Win32 de Mono en Wine. Si la arquitectura de la CPU también es diferente, sería necesario emularla, entonces Mono en Wine en Qemu).

Sladen
fuente
22

La respuesta corta:

.NET es la respuesta de Microsoft a Java, y Mono es una implementación de código abierto. Wine es para ex nativos y no tiene nada que ver con Mono, excepto que quizás pueda ejecutar el tiempo de ejecución .NET con él, como cualquier otro software nativo de Windows.


La respuesta larga:

Para comprender la diferencia entre Wine y Mono (y .NET) debe comprender la diferencia entre los ejecutables de código de máquina nativa y los ejecutables de "tiempo de ejecución de lenguaje común", también conocidos como "máquina virtual":

Los ejecutables de códigos de máquina nativos usan códigos de instrucciones específicos de su procesador y los ejecuta directamente. Eso significa que tienen que ser recompilados para diferentes procesadores. Wine puede ejecutar ejecutables de código máquina nativos para Windows ejecutando directamente este código ejecutable y capturando cualquier llamada a la biblioteca que realice, redirigiéndola a su propia implementación de la API Win32.

Los ejecutables "CLR" o "VM" no son específicos de un procesador: necesitan un software adicional para que el procesador pueda ejecutarlos. Mono / .NET es un ejemplo de este tipo de sistema. Los programas .NET necesitan el tiempo de ejecución .NET instalado incluso cuando los ejecuta en Windows. Java funciona de la misma manera.

Asi que:

1) la diferencia entre Wine y Mono: Wine es para ejecutar ejecutables de código máquina nativos creados para Windows, y Mono es para ejecutar ejecutables Mono / .NET que no están hechos necesariamente para ninguna plataforma específica. Instalar Mono en Linux es equivalente a instalar .NET runtime en Windows.

2) Si el programa que desea ejecutar no usa .NET en absoluto, debe usar Wine. Mono no te ayudará en nada aquí.

Sin embargo, si el programa usa .NET, tiene dos opciones, cualquiera de las cuales puede o no funcionar:

  • Puedes intentar ejecutarlo usando Mono. Esto fallará si el programa .NET también usa funciones nativas de la API win32, lo que hacen muchas (pero no todas) las aplicaciones .NET hechas para Windows.

  • Alternativamente, puede instalar el tiempo de ejecución de Microsoft .NET para Windows dentro de Wine y luego ejecutar la aplicación .NET a través de él. No usarás Mono en absoluto en este caso.

3) Wine y Mono no dependen el uno del otro, pero como se indicó anteriormente, puede usar el tiempo de ejecución de Microsoft .NET en Wine para ejecutar aplicaciones Mono / .NET.

Alistair Buxton
fuente
¡Gracias! (1) Entonces, si una aplicación depende de .NET y win32, ¿la única forma es instalar .NET en Wine y luego instalar la aplicación en Wine? (2) ¿Cómo saber si una aplicación se basa en .NET y / o win32?
Tim
1
La escritura file *.exemostrará información sobre el conjunto de instrucciones de la CPU y el tipo de archivo. Si se trata de una aplicación CLI / CLR (".Net" / Mono) que también utiliza llamadas nativas de API Win32, deberá ejecutarla o buscar cualquier file *.dllarchivo que se muestre como nativo x86 + Win32.
Sladen
También puede instalar Mono para Windows en Wine, pero de acuerdo con las Preguntas frecuentes de Wine, es menos probable que funcione que el tiempo de ejecución de .NET. No hay una manera simple de saber si un programa .NET usa llamadas win32 nativas, ya que hay muchas formas diferentes de hacerlo. Lo mejor es probar Mono primero, si no funciona, prueba Wine + .NET.
Alistair Buxton