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).