【发布时间】:2019-05-11 16:10:01
【问题描述】:
在我的 Arch Linux 机器上,我安装了 Mono C# 编译器 [版本 5.20.1.0]。我今天用 C# 创建了一个简单的 hello world 程序如下:
using System;
public class Program
{
public static int Main()
{
Console.WriteLine("Hello world of C# !");
Console.WriteLine();
return 0;
}
}
我去了我的 bash 终端并将上面的程序编译为
$ mcs t.cs
这在工作目录中创建了一个文件名 t.exe。然后我输入:
$ ./t.exe
输出是
Hello world of C# !
我很惊讶地看到这一点,因为以前不是这种情况。您无法从 linux 命令行直接执行单声道生成的 .exe 文件。要运行上面生成的 t.exe 可执行文件,您必须执行以下操作:
$ mono t.exe
为了进一步调查(并检查文件格式)由 mono 编译器生成,我运行了 file 命令,就像这样,
$ file t.exe
它产生了以下输出:
t.exe: PE32 executable (console) Intel 80386 Mono/.Net assembly, for MS Windows
我搜索了互联网,但无法弄清楚为什么会发生这种情况。不是我在抱怨,我很喜欢它。但是 linux 命令行如何像这样直接运行 .net 或 mono 可执行文件呢?怎么了??
【问题讨论】:
-
嗯,Google 没有透露任何关于该主题的内容(即在 Linux 中运行单声道/.NET 可执行文件)吗?
-
不——它没有给出任何相关的信息。关于如何在安装了 mono 的 linux 上运行 .exe 文件的旧东西(就像我上面提到的)——但没有任何关于为什么由 mono 生成的 .exe 文件应该在 linux 命令行上直接运行 --- 就好像它是直接在工作中生成的本机二进制文件。这很奇怪。我以前在 Linux 上构建了很多小型玩具 .net/mono 项目....但总是不得不在 bash 命令行上在可执行文件之前提到“mono”——比如:$ mono example.exe
-
一个快速的 Goolge 变成了这个:mono-project.com/archived/guiderunning_mono_applications/…。请参阅“将 .exe 注册为非本地二进制文件(仅限 Linux)”一章。请注意,这不是 Mono 功能,而是 Linux 的 binfmt 子系统启用的功能。 (但不要问我关于 binfmt 的事,我(还)不是真正的 Linux 用户 ;-))
-
哦,哇,谢谢@elgonzo --- 所以它是一个 linux 内核功能 -- 我怎么能错过它作为一个多年的 linux 用户和一个 C# 爱好者,也是很长一段时间。我想,我从来没有尝试过直接执行 .exe 文件……因此从未注意到它。我认为 Arch Linux 上的 mono 安装过程会自动激活这个 binfmt 东西。将不得不深入挖掘。再次感谢 --- 只需将您的评论复制粘贴到答案中,这样我就可以将其标记为正确。 :)
-
在下面回答。想一想,我想问题/答案是在superuser.com 有一个更好的家(因为它不是真正与编程相关,而是关于系统配置)。因此,如果碰巧有模组将您的问题转移到那里,请不要感到惊讶。 ;-)(也许不会发生,谁知道...)