Diferença entre vinho e mono

31

Até onde eu sei, o Wine e o Mono são usados ​​para executar aplicativos do Windows no Ubuntu.

Então eu estava pensando

  1. quais são as suas diferenças? Ambas são máquinas virtuais? Ou cada um pertence a alguma outra categoria?
  2. É melhor Quando usar qual para quais tipos de aplicativos Windows? Por exemplo, os aplicativos que podem ou não exigir o .net Framework.
  3. Eles dependem um do outro? Eles precisam instalar juntos? Ou cada um trabalha independentemente, sem a existência do outro?

Obrigado e cumprimentos!

Tim
fonte

Respostas:

34

A execução bem-sucedida de um programa requer que três itens correspondam:

  • Conjunto de instruções da CPU (por exemplo, x86 no seu PC, ARM no seu celular, PowerPC em alguns Apple Macs, código de bytes Java para Java Applets, CLI para aplicativos ".Net" / Mono)
  • Formato de arquivo binário (por exemplo, PE / COFF ".exe" para Microsoft Windows, .jar para Java Applets, PE32 ".exe", ELF em Unix / Linux)
  • Interface de programação de aplicativos ; (Por exemplo, POSIX no Linux / Unix, Cocoa para Mac OSX, Win32 no Microsoft Windows, Biblioteca de classes base para aplicativos ".Net" / Mono).

Você pode aumentar a chance de combinar os três, possuindo emuladores / intérpretes (para outros conjuntos de instruções da CPU), carregadores de arquivos extras (para formatos de arquivo externos) e bibliotecas de programação adicionais que fornecem mais APIs.

Observe também que alguns processadores podem executar nativamente mais de um conjunto de instruções; um PC geralmente possui conjuntos de instruções x86 e amd64 ; um processador ARM pode executar quatro: ARM32 / Thumb / Java bytecode / ThumbEE . Alguns sistemas operacionais também podem fornecer mais de uma API nativamente (o Microsoft Windows fornece Win32 e POSIX ).

Para todo o resto, você precisa de software extra. Para executar programas Java, você precisa das três partes listadas acima para fazê-lo funcionar: um programa Java Virtual Machine para executar o bytecode; uma maneira de iniciar programas Java e uma biblioteca de classes Java para os programas chamarem. "Java" é um nome de marca aqui para várias tecnologias separadas originalmente desenvolvidas pela Sun, mas para um usuário elas geralmente são baixadas como um.

O mesmo se aplica ao ".Net", que é um nome de marca de marketing para diversas tecnologias originalmente desenvolvidas pela Microsoft: O CLR ( Common Language Run-time / Base Class Library ) é a API; O VES é o carregador e a Common Language Interface (CLI) é o conjunto de instruções.

Você não precisa baixar essas tecnologias da Microsoft, da Sun ou da Intel apenas porque elas inventaram algo originalmente. A AMD torna os processadores compatíveis com os padrões da Intel; o Apache ("Harmony") e o Google ("Android Dalvik") formam um conjunto semelhante ao Java; e o Mono fornece um pacote CLR / CLI / VES. O importante é que todos usem os mesmos padrões, tornando-os compatíveis. Um disco de DVD será reproduzido em qualquer reprodutor de DVD que atenda ao padrão, e uma página da Web em HTML será renderizada em qualquer navegador da Web que atenda aos padrões de HTML.

  • Mono é um conjunto CLR / CLI / VES que pode ser executado no Mac OSX, MS Windows e Linux.
  • O Wine é uma implementação da API do Win32 que pode ser executada no Mac OSX, MS Windows e Linux.
  • Você pode executar o Mono em cima do Wine , em qualquer sistema operacional.
  • Você pode executar o Wine sobre o Qemu , sobre qualquer arquitetura de CPU.

Portanto, o Mono faz com que os aplicativos .exe do CLR sejam executados e o Wine faz com que os aplicativos .exe do Win32 sejam executados. A única coisa em comum é que os nomes de arquivos terminam em ".exe"; o conteúdo é completamente diferente e incompatível, então você precisa do conteúdo certo .

Assim como um intérprete Python cometerá um erro quando apresentado com Perl (e vice-versa), um intérprete CLR cometerá um erro quando apresentado com x86 + Win32 ou bytecode JVM + Java. Se você puder postar um link para o programa específico que deseja executar, eu ou outra pessoa poderá informar o conjunto exato de instruções, o formato do arquivo e a API para a qual foi projetado e o que você precisa instalar no Linux para executá-lo. Espero que ajude!

(Às vezes você pode precisar dos dois. Por exemplo, o simulador de trem Openbve é C # e compilado em PE / COFF + CLI + CLR, mas pode usar opcionalmente plugins binários C compilados para PE / COFF + Win32 + x86. Nesse caso, você precisa de uma versão Win32 do Mono no Wine. Se a arquitetura da CPU também for diferente, seria necessário emular o Mono no Wine no Qemu).

sladen
fonte
22

A resposta curta:

.NET é a resposta da Microsoft para Java e Mono é uma implementação de código aberto. O Wine é para exes nativos e não tem nada a ver com o Mono, exceto que você pode executar o .NET runtime com ele, como qualquer outro software nativo do Windows.


A resposta longa:

Para entender a diferença entre o Wine e o Mono (e .NET), você deve entender a diferença entre os executáveis ​​de código de máquina nativo e os executáveis ​​"common language runtime", também conhecidos como "máquina virtual":

Os executáveis ​​nativos de código de máquina usam códigos de instrução específicos para o seu processador e são executados diretamente por ele. Isso significa que eles precisam ser recompilados para diferentes processadores. O Wine pode executar executáveis ​​de código de máquina nativo para Windows executando diretamente esse código executável e capturando todas as chamadas de biblioteca que ele fizer, redirecionando-os para sua própria implementação da API do Win32.

Os executáveis ​​"CLR" ou "VM" não são específicos para um processador: eles precisam de um software extra para permitir que o processador os execute. Mono / .NET é um exemplo desse tipo de sistema. Os programas .NET precisam do tempo de execução .NET instalado, mesmo quando você os executa no Windows. Java funciona da mesma maneira.

Tão:

1) a diferença entre o Wine e o Mono: o Wine é para executar executáveis ​​de código de máquina nativos criados para Windows e Mono é para executar executáveis ​​Mono / .NET que não são necessariamente criados para nenhuma plataforma específica. Instalar o Mono no Linux é equivalente a instalar o .NET runtime no Windows.

2) Se o programa que você deseja executar não usa .NET, você deve usar o Wine. Mono não vai ajudar em nada aqui.

No entanto, se o programa usa o .NET, você tem duas opções, que podem ou não funcionar:

  • Você pode tentar executá-lo usando o Mono. Isso falhará se o programa .NET também usar funções nativas da API win32, que muitos (mas não todos) aplicativos .NET criados para Windows fazem.

  • Como alternativa, você pode instalar o tempo de execução do Microsoft .NET para Windows no Wine e, em seguida, executar o aplicativo .NET por meio dele. Você não estará usando o Mono nesse caso.

3) O Wine e o Mono não dependem um do outro, mas conforme mencionado acima, você pode usar o tempo de execução do Microsoft .NET no Wine para executar aplicativos Mono / .NET.

Alistair Buxton
fonte
Obrigado! (1) Portanto, se um aplicativo depende do .NET e do win32, a única maneira é instalar o .NET no Wine e depois instalar o aplicativo no Wine? (2) Como saber se um aplicativo depende do .NET e / ou win32?
Tim
11
A digitação file *.exemostrará informações sobre o conjunto de instruções da CPU e o tipo de arquivo. Se for um aplicativo CLI / CLR (".Net" / Mono) que também usa chamadas nativas da API do Win32, será necessário executá-lo ou procurar qualquer file *.dllarquivo que mostre como x86 + Win32 nativo.
Sladen
Você também pode instalar o Mono for Windows no Wine, mas, de acordo com as Perguntas frequentes do Wine, é menos provável que funcione que o tempo de execução do .NET. Não há uma maneira simples de saber se um programa .NET usa chamadas win32 nativas, pois existem várias maneiras diferentes de fazê-lo. A melhor coisa a fazer é experimentar o Mono primeiro, se não funcionar, experimente o Wine + .NET.
Alistair Buxton