Rya*_*son 5 linux file-association mono-framework
因此,我使用 MonoDevelop 在 Linux 上编译了一个 C# 程序。当我尝试执行生成的二进制文件时,我的系统尝试将它作为 Windows 可执行文件和 wine 运行,但失败了。Wine 给了我以下信息:
$ ~/bin/MyMonoApp
wine: Install the Windows version of Mono to run .NET executables
~/bin/MyMonoApp: command not found
Run Code Online (Sandbox Code Playgroud)
我只能通过显式调用说服它运行mono:
$ mono ~/bin/MyMonoApp
Run Code Online (Sandbox Code Playgroud)
那么,如何将其设置为默认值,这样我就不必每次都显式调用单声道?
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);对于 mono,检测器/usr/lib/cli/binfmt-detector-cli位于mono-common或mono-runtime包中。
如果您的发行版没有特殊支持,并且您不关心 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.gzLinux 内核文档中。
解决您的问题的一种方法是取消注册 wine 格式;无论哪个引导脚本注册二进制格式,您都必须这样做。另一种解决方案是找出启动过程中wine格式的注册位置并跳过这部分。第三种解决方案是找到一种方法来区分 .NET 可执行文件和其他 Windows 可执行文件,并在通用 Windows 幻数之后注册 .NET 幻数。