【问题标题】:Mono compiler generated .exe runs directly from linux command line , why?Mono 编译器生成的 .exe 直接从 linux 命令行运行,为什么?
【发布时间】: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 有一个更好的家(因为它不是真正与编程相关,而是关于系统配置)。因此,如果碰巧有模组将您的问题转移到那里,请不要感到惊讶。 ;-)(也许​​不会发生,谁知道...)

标签: c# linux mono


【解决方案1】:

.NET .exe 文件在 Linux 中的“直接”执行 (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),同时将键入的文件的名称/路径传递到 shell。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 2020-12-01
    • 2014-05-26
    • 1970-01-01
    • 2017-03-04
    • 2012-05-28
    相关资源
    最近更新 更多