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

标签 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 命令行直接执行单声道生成的 .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 可执行文件呢?发生了什么事??

最佳答案

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

引自 Wikipedia :

binfmt_misc is a capability of the Linux kernel which allows arbitrary executable file formats to be recognized and passed to certain user space applications, such as emulators and virtual machines.

要启用 .NET 可执行文件的“直接”执行,类似于以下的行需要出现在一个可能的配置文件中 binfmt.d directories .

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

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


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

关于c# - Mono 编译器生成的 .exe 直接从 linux 命令行运行,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56092081/

相关文章:

c# - 通过批处理文件更改其他用户的注册表

c# - 我可以使用 LINQ 检查列表中的对象是否具有唯一 ID 吗?

python - Windows 和 Linux 中正则表达式的不同结果?

linux - 如何从 linux 内核内部发送 UDP 数据包

.net - 未找到或无法加载程序集 mscorlib.dll

asp.net - ASP.NET 在 Mono(Linux) 与 IIS(Window) 中的性能

c# - LINQ:按最常见值的计数排序

c# - 无法从高阶函数的用法中推断出类型参数

c - 杀死由其他程序创建的子程序

c# - 为什么不能将迭代器 block 与 IOrderedEnumerable 一起使用