Executar com sucesso um programa exige que três coisas correspondam:
- Conjunto de instruções de CPU (Por exemplo, x86 no seu PC, ARM no seu telemóvel, PowerPC em alguns Macs da Apple , Java bytecode para applets Java, 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 no 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 todos os três tendo emuladores / intérpretes (para outros conjuntos de instruções de CPU), tendo carregadores de arquivos extras (para formatos de arquivos estrangeiros) e tendo bibliotecas de programação adicionais fornecendo mais APIs.
Note também que alguns processadores podem executar nativamente mais de um conjunto de instruções; um PC geralmente tem conjuntos de instruções x86 e amd64 ; um processador ARM pode executar quatro: ARM32 / Thumb / Java bytecode / ThumbEE . Alguns sistemas operacionais podem fornecer mais de uma API nativamente também (o Microsoft Windows fornece Win32 e POSIX ).
Para tudo o mais, você precisa de um 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 lançar programas Java e uma biblioteca de classes Java para os programas a serem chamados. "Java" é uma marca aqui para várias tecnologias separadas originalmente desenvolvidas pela Sun, mas para um usuário elas geralmente são baixadas como uma.
O mesmo se aplica a ".Net", que é uma marca de marketing para várias tecnologias diferentes originalmente desenvolvidas pela Microsoft: A Biblioteca de Classes de Tempo Comum / Base (CLR) é a API; VES é o loader e 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; Tanto o Apache ("Harmony") quanto o Google ("Android Dalvik") fazem ambos uma suíte semelhante a Java; e Mono fornece um conjunto CLR / CLI / VES. O importante é que todos usem os mesmos padrões, tornando-os compatíveis. Um DVD será reproduzido em qualquer reprodutor de DVD que atenda ao padrão, e uma página HTML será renderizada em qualquer navegador que atenda aos padrões HTML.
- Mono é uma suíte CLR / CLI / VES que pode ser executada 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 Mono em cima do Wine , além de qualquer sistema operacional.
- Você pode executar o Wine em cima do Qemu , sobre qualquer arquitetura de CPU.
Então Mono faz com que os aplicativos CLR .exe sejam executados e Wine faz com que os aplicativos Win32 .exe sejam executados. A única coisa em comum é que os nomes dos arquivos terminam em ".exe"; o conteúdo é completamente diferente e incompatível, então você precisa do certo .
Da mesma forma que um interpretador Python apresentará um erro quando apresentado com Perl (e vice-versa), um interpretador CLR apresentará um erro quando apresentado com bytecode x86 + Win32 ou JVM + Java. Se você puder postar um link para o programa específico que deseja executar, eu ou outra pessoa poderemos lhe dizer o conjunto exato de instruções, o formato de arquivo e a API para os quais foi criado e o que você precisa instalar no Linux para executá-lo. Espero que ajude!
(Às vezes você pode até precisar dos dois. Por exemplo, o simulador de trem Openbve é C # e compilado para PE / COFF + CLI + CLR, mas pode opcionalmente usar plug-ins binários C compilados para PE / COFF + Win32 + x86. Neste 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; portanto, Mono sob Wine no Qemu).