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

Так, я скомпилировал программу 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

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

5
задан 13.07.2014, 13:33

1 ответ

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

7
ответ дан 07.12.2019, 17:29

Теги

Похожие вопросы