Моно сгенерированный .exe запускается непосредственно из командной строки Linux, почему? - PullRequest
1 голос
/ 11 мая 2019

На моей машине с Arch Linux у меня установлен Mono C # компилятор [версия 5.20.1.0]. Сегодня я создал простую программу Hello World на C # следующим образом:

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# !

Я был удивлен, увидев это, так как раньше этого не было. Вы НЕ МОЖЕТЕ выполнить моно-файл .exe напрямую из командной строки linux. Чтобы запустить полученный выше 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 Ответ

1 голос
/ 11 мая 2019

«Прямое» выполнение (1) файлов .NET .exe в Linux - это возможность, включенная через подсистему Linux * binfmt_misc .

Цитата из Википедия :

binfmt_misc - это возможность ядра Linux, которая позволяет распознавать произвольные форматы исполняемых файлов и передавать их в определенные приложения пользовательского пространства, такие как эмуляторы и виртуальные машины.

Чтобы включить «прямое» выполнение исполняемых файлов .NET, в конфигурационном файле должна присутствовать строка, подобная следующей, в одной из возможных binfmt.d директорий .

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

Кроме того, в качестве последнего шага для любого .NET .exe, который должен быть «непосредственно» исполняемым, должен быть установлен флаг выполнения (chmod 755 ...).


(1) «Прямое» выполнение здесь означает, что пользователю просто нужно ввести имя файла в оболочке, а binfmt_misc позаботится об автоматическом выполнении соответствующего фактического исполняемого файла / скрипта Linux (здесь в данном случаеmono) при передаче имени / пути к файлу, введенному в оболочку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...