5

Итак, я скомпилировал программу на 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 ответ1

7

Выполнение двоичных файлов в ядре 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 в пакете mono-common или mono-runtime .

Если в вашем дистрибутиве нет особой поддержки, и вам не нужны винные бинарные файлы, более простой маршрут будет проще. Модуль 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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .