在不输入'mono foo.exe'的情况下运行一个Mono程序。

在Ubuntu上运行.NET程序时,我必须输入"mono foo.exe"而不是只输入foo.exe或双击图标。有没有办法直接运行foo.exe?
4个回答

这个链接有用吗?运行Mono

来自Mono项目关于使用binfmt的信息:

将.exe注册为非本地二进制文件(仅限Linux)

由于这是一个特定于Linux的功能,我们不建议开发人员部署此解决方案,因为它会限制脚本的可移植性。

此外,这种机制不符合应用程序部署指南的预期。

您还可以进行系统范围的更改,并使用binfmt将exe文件注册为非本地二进制文件。然后,在尝试启动exe文件时,内核会运行mono解释器处理命令。Binfmt也可以用来使用WINE启动Windows可执行文件,或者使用JVM启动Java .class文件。要向内核注册exe文件:

以root用户身份执行以下命令,启用内核中的binfmt模块:

sudo apt-get install binfmt-support
modprobe binfmt_misc

另外,你可能想要在你的`/etc/rc.local`启动脚本中添加`modprobe`命令,这样它就会在启动时执行。
将下面的行添加到你的`/etc/fstab`文件中:
binfmt_misc /proc/sys/fs/binfmt_misc binfmt_misc none

然后,在系统启动时运行以下命令:
echo ':CLR:M::MZ::/usr/bin/mono:' > /proc/sys/fs/binfmt_misc/register

确保在文件系统中将您的.exe文件标记为可执行文件:
chmod +x myprogram.exe

请注意,这不会改变您的内核,只会在系统启动时加载模块。换句话说,您可以升级内核而不必担心丢失这些更改。同样地,您可以升级Mono运行时而不会影响本节中列出的任何调用方法。

+1 对于 Linux 来说,binfmt_misc 选项是最小的解决方法。 - mario
1在12.04中出现了FATAL: Module binfmt not found错误。 - RiaD

创建一个启动脚本。
打开一个纯文本编辑器,添加以下内容:
#!/bin/bash
mono foo.exe &

根据您的设置,您可能需要使用 foo.exe 的完整路径。
例如将文件保存为 foo.sh。
使其可执行:
sudo chmod a+x foo.sh

您现在应该可以通过双击 foo.sh 来启动 foo.exe。


你可以将文件扩展名'.exe'在Nautilus中与/usr/bin/mono关联起来,以便执行。

我知道这是一个旧问题,但我通过谷歌找到了它并让我思考。 这是一个重大的黑客攻击,但你可以下载。

https://raw.githubusercontent.com/rcaloras/bash-preexec/master/bash-preexec.sh

将以下内容添加到.bashrc文件中,然后返回到你的主目录。
source ~/.bash-preexec.sh
preexec() {
  if [[ $1 =~ [^\s]+\.exe$ ]]; then
    eval "$1() { return 1; }"
    export -f $1
    /usr/bin/mono $1
  fi
}
precmd() { [[ $1 =~ [^\s]+\.exe$ ]]; unset -f $1; }