Почему Ubuntu пытается открыть мое приложение Mono с Wine вместо Mono?

Итак, я скомпилировал программу на C# для Linux, используя MonoDevelop. Когда я пытаюсь выполнить полученный бинарный файл, моя система пытается и не может запустить его как исполняемый файл Windows с Wine. Вино дает мне следующее сообщение:

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

Я могу только убедить его запустить, явно вызвав mono:

$ mono ~/bin/MyMonoApp

Итак, как я могу сделать это по умолчанию, чтобы мне не приходилось каждый раз явно вызывать моно?

1 ответ

Выполнение двоичных файлов в ядре Linux контролируется через binfmt_miscмодуль (сокращение от "разные двоичные форматы"). Это работает так, что ядро ​​просматривает первые несколько байтов файла и определяет, существует ли "магическое число", которое характеризует известный формат файла. Идея состоит в том, что если ядро ​​видит магическое число исполняемого файла.NET, оно вызывает mono; если он видит магическое число jar (двоичный файл виртуальной машины Java), он вызывает JRE; и т.п.

Проблема с Mono и Wine состоит в том, что магическое число одинаково - исполняемый файл.NET - исполняемый файл Windows. Если оба формата зарегистрированы с binfmt_miscВ зависимости от того, что зарегистрировано, последний выигрывает. К сожалению.

В системе, основанной на Debian, магическое число для исполняемых файлов Windows напрямую не вызывает wine или mono: оно проходит через скрипт, который выполняет дополнительные тесты, чтобы решить, какую среду использовать. Рассматриваемый скрипт изначально был написан для Debian; он может использоваться другими дистрибутивами (например, Ubuntu сохранил его).

Очевидно, ваш дистрибутив (какой? Вы не говорите!) Не использует его. Первое, что нужно проверить, будет ли в некоторых обновлениях, которые вы не применяли, что-то подобное. Если вы хотите портировать механизм, вот где найти биты; это небольшая задача программирования. Сценарий /usr/share/binfmt-support/run-detectors в пакете binfmt-support (вам нужны библиотеки в /usr/share/perl5/Binfmt также); для моно детектор /usr/lib/cli/binfmt-detector-cli в моно-общем или моно-исполняемом пакете.

Если в вашем дистрибутиве нет особой поддержки, и вам не нужны винные бинарные файлы, более простой маршрут будет проще. binfmt_misc модуль управляется через /proc/sys/fs/binfmt_misc каталог. Вы можете зарегистрировать формат, написав /proc/sys/fs/binfmt_misc/register; каждый файл в этом каталоге, кроме register а также status представляет зарегистрированный формат. Будьте осторожны при написании register: если вы случайно зарегистрировали магическое число, которое соответствует собственным исполняемым файлам Linux (ELF), вы, вероятно, подключите свою систему без каких-либо мер, кроме перезагрузки. Отменить регистрацию wine формат, эхо -1 в /proc/sys/fs/binfmt_misc/wine, binfmt_misc Модуль задокументирован в Documentation/binfmt_misc.txt.gz в документации ядра Linux.

Одним из решений вашей проблемы будет отмена регистрации формата вина; Вы должны будете сделать это после того, как загрузочный скрипт зарегистрирует двоичные форматы. Альтернативное решение - выяснить, где в процессе загрузки зарегистрирован формат вина, и пропустить эту часть. Третье решение - найти способ отличить исполняемые файлы.NET от других исполняемых файлов Windows и зарегистрировать магическое число.NET после общего магического номера Windows.

Другие вопросы по тегам