Por que o Ubuntu está tentando abrir meu aplicativo Mono com o Wine em vez do Mono?

5

Então, eu compilei um programa C # no Linux usando o MonoDevelop. Quando tento executar o binário resultante, meu sistema tenta e não consegue executá-lo como um executável do windows, com wine. Vinho me dá a seguinte mensagem:

$ ~/bin/MyMonoApp
wine: Install the Windows version of Mono to run .NET executables
~/bin/MyMonoApp: command not found

Eu só posso convencê-lo a executar chamando explicitamente mono :

$ mono ~/bin/MyMonoApp

Então, como posso fazer disso o padrão, então não preciso chamar explicitamente o mono toda vez?

    
por Ryan Thompson 24.08.2010 / 17:52

1 resposta

7

A execução de binários no kernel Linux é controlada através do binfmt_misc module (abreviação de “diversos formatos binários”). A maneira como funciona é que o kernel examina os primeiros bytes do arquivo e vê se existe um “ número mágico ” que caracteriza um formato de arquivo conhecido. A idéia é que, se o kernel visualizar o número mágico de um executável .NET, ele chama mono ; se ele vir o número mágico de um jar (binário de máquina virtual Java), ele chama um JRE; etc.

O problema com Mono e Wine é que o número mágico é o mesmo - um executável .NET é um executável do Windows. Se ambos os formatos estiverem registrados com binfmt_misc , o que for registrado pela última vez ganha. Opa.

Em um sistema derivado do Debian, o número mágico para executáveis do Windows não invoca wine ou mono diretamente: ele passa por um script que realiza testes adicionais para decidir qual ambiente usar. O script em questão foi inicialmente escrito para o Debian; poderia ser usado por outras distribuições (por exemplo, o Ubuntu o manteve).

Aparentemente, sua distribuição (qual deles? você não diz!) não usa. A primeira coisa a verificar seria se algumas atualizações que você não aplicou incluem algo semelhante. Se você gostaria de portar o mecanismo, aqui é onde encontrar os bits; é uma pequena tarefa de programação. O script é /usr/share/binfmt-support/run-detectors no pacote binfmt-support (você também precisa das bibliotecas em /usr/share/perl5/Binfmt ) ; para mono, o detector é /usr/lib/cli/binfmt-detector-cli no mono-comum ou mono-runtime package.

Se a sua distribuição não tem suporte especial e você não se importa com os binários de vinhos, uma rota mais manual seria mais fácil. O módulo binfmt_misc é controlado pelo diretório /proc/sys/fs/binfmt_misc . Você pode registrar um formato escrevendo para /proc/sys/fs/binfmt_misc/register ; Cada arquivo nesse diretório diferente de register e status representa um formato registrado. Tenha cuidado ao gravar em register : se você registrar acidentalmente um número mágico que corresponda a executáveis nativos do Linux (ELF), é provável que você mangueira seu sistema sem solução diferente de reinicialização. Para anular o registo do formato wine , echo -1 to /proc/sys/fs/binfmt_misc/wine . O módulo binfmt_misc está documentado em Documentation/binfmt_misc.txt.gz na documentação do kernel do Linux.

Uma solução para o seu problema seria cancelar o registro do formato do vinho; você teria que fazer isso depois do script de inicialização registrar os formatos binários. Uma solução alternativa é descobrir onde, no processo de inicialização, o formato do vinho está registrado e pular esta parte. Uma terceira solução é encontrar uma maneira de distinguir executáveis .NET de outros executáveis do Windows e registrar o número mágico do .NET após o número mágico genérico do Windows.

    
por 24.08.2010 / 21:26