因此,我使用 MonoDevelop 在 Linux 上编译了一个 C# 程序。当我尝试执行生成的二进制文件时,我的系统尝试使用 wine 将其作为 Windows 可执行文件运行,但失败了。Wine 向我提供了以下消息:
$ ~/bin/MyMonoApp
wine: Install the Windows version of Mono to run .NET executables
~/bin/MyMonoApp: command not found
我只能通过明确调用来让它运行mono
:
$ mono ~/bin/MyMonoApp
那么,我怎样才能将其设为默认值,这样我就不必每次都明确调用 mono?
答案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-支持包(您还需要库/usr/share/perl5/Binfmt
);对于单声道,检测器/usr/lib/cli/binfmt-detector-cli
位于单一共同或者单声道运行时包裹。
如果您的发行版没有特殊支持,并且您不关心 Wine 二进制文件,那么更手动的路线会更容易。模块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 内核文档中。
解决您问题的一个方法是取消注册 wine 格式;您必须在启动脚本注册二进制格式之后执行此操作。另一种解决方案是找出在启动过程中注册 wine 格式的位置并跳过此部分。第三个解决方案是找到一种方法来区分 .NET 可执行文件与其他 Windows 可执行文件,并在通用 Windows 幻数之后注册 .NET 幻数。