Так, я скомпилировал программу C# на использовании Linux MonoDevelop. Когда я пытаюсь выполнить получающийся двоичный файл, моя система пробует и сбои для выполнения его как исполняемого файла окон с вином. Вино дает мне следующее сообщение:
$ ~/bin/MyMonoApp
wine: Install the Windows version of Mono to run .NET executables
~/bin/MyMonoApp: command not found
Я могу только убедить это работать путем явного вызова mono
:
$ mono ~/bin/MyMonoApp
Так, как я могу сделать это значением по умолчанию, таким образом, я не должен явно называть моно каждый раз?
Выполнением двоичных файлов в ядре Linux управляют через binfmt_misc
модуль (короткий для “разных двоичных форматов”). Путем это работает, то, что ядро смотрит на первые несколько байтов файла и видит, существует ли “магическое число”, которое характеризует известный формат файла. Идея состоит в том, что, если ядро видит магическое число исполняемого файла.NET, это звонит mono
; если это видит магическое число банки (двоичный файл виртуальной машины Java), это называет JRE; и т.д.
Проблема с Моно и Вином состоит в том, что магическое число является тем же — исполняемый файл.NET является исполняемым файлом Windows. Если оба формата регистрируются в binfmt_misc
, какой бы ни регистрируется последние победы. Ой.
В Debian-полученной системе магическое число для исполняемых файлов Windows не вызывает вино или моно непосредственно: это идет с помощью сценария, который выполняет дополнительные тесты для решения который среда использовать. Рассматриваемый сценарий был первоначально записан для Debian; это могло использоваться другими дистрибутивами (например, Ubuntu сохранила его).
По-видимому, Ваше распределение (который?да что ты говоришь!) не использует его. Первая вещь проверить состояла бы в том, если некоторые обновления, которые Вы не применили, включают что-то подобное. Если требуется портировать механизм, вот то, где найти биты; это - небольшая задача программирования. Сценарий /usr/share/binfmt-support/run-detectors
в пакете binfmt-поддержки (Вам нужны библиотеки в /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.