Mono编译器生成的.exe直接从linux命令行运行,为什么?

时间:2019-05-11 16:10:01

标签: c# linux mono

在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命令行直接直接执行Mono生成的.exe文件。要运行上面生成的 t.exe 可执行文件,您必须执行以下操作:

$ mono t.exe 

要进一步研究单声道编译器生成的文件(并检查文件格式),我运行了 file 命令,就像这样

$ file t.exe 

它产生了以下输出:

t.exe: PE32 executable (console) Intel 80386 Mono/.Net assembly, for MS Windows

我搜索了互联网,但不知道为什么会这样。不是我在抱怨,我是在爱它。但是,Linux命令行如何像这样直接运行.net或mono可执行文件?发生了什么??

1 个答案:

答案 0 :(得分:1)

Linux中.NET .exe文件的“直接”执行(1)是通过Linux的binfmt_misc子系统启用的功能。

引用Wikipedia

  

binfmt_misc 是Linux内核的一项功能,该功能允许识别任意可执行文件格式并将其传递给某些用户空间应用程序,例如模拟器和虚拟机。

要启用“ .NET”可执行文件的“直接”执行,需要在可能的binfmt.d directories之一中的配置文件中显示类似于以下内容的行。

:CLR:M::MZ::/usr/bin/mono:

另外,作为最后一步,任何应为“直接”可执行文件的.NET .exe都需要设置其执行标志(chmod 755 ...)。


(1)这里的“直接”执行意味着用户只需要在shell中键入文件名,而 binfmt_misc 会自动执行相关的实际Linux可执行文件/脚本(这里是mono),同时将键入的文件的名称/路径传递到外壳中。