Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Mono编译器生成的.exe直接从linux命令行运行,为什么?_C#_Linux_Mono - Fatal编程技术网

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

C# Mono编译器生成的.exe直接从linux命令行运行,为什么?,c#,linux,mono,C#,Linux,Mono,在我的Arch Linux机器上安装了Mono C#编译器[version 5.20.1.0]。我今天用C#创建了一个简单的hello world程序,如下所示: 使用系统; 公共课程 { 公共静态int Main() { Console.WriteLine(“你好,C#的世界!”; Console.WriteLine(); 返回0; } } 我去了我的bash终端,将上面的程序编译为 $mcs t.cs 这在工作目录中创建了一个文件名t.exe。然后我进入: $./t.exe 结

在我的Arch Linux机器上安装了Mono C#编译器[version 5.20.1.0]。我今天用C#创建了一个简单的hello world程序,如下所示:

使用系统;
公共课程
{
公共静态int Main()
{
Console.WriteLine(“你好,C#的世界!”;
Console.WriteLine();
返回0;
}    
}
我去了我的bash终端,将上面的程序编译为

$mcs t.cs
这在工作目录中创建了一个文件名t.exe。然后我进入:

$./t.exe
结果是

你好,C世界!
我很惊讶地看到这一点,因为以前的情况并非如此。无法从linux命令行直接执行mono生成的.exe文件。要运行上面生成的t.exe可执行文件,必须执行以下操作:

$mono t.exe
为了进一步研究mono编译器生成的文件(并检查文件格式),我运行了file命令,如下所示

$file t.exe
它产生了以下产出:

t.exe:PE32可执行文件(控制台)英特尔80386 Mono/.Net汇编,适用于MS Windows
我在互联网上搜索过,但不知道为什么会发生这种情况。我不是在抱怨,而是喜欢。但是linux命令行如何像这样直接运行.net或mono可执行文件呢?发生了什么事???

在Linux中直接执行.NET.exe文件是通过Linux子系统启用的一种功能

引自:

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

要启用.NET可执行文件的“直接”执行,需要在配置文件中的一个可能的

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



(1) 这里的“直接”执行意味着用户只需在shell中键入文件名,而binfmt_misc负责在将键入的文件名/路径传递到shell中时自动执行相关的实际Linux可执行文件/脚本(在本例中为
mono
),谷歌没有透露任何关于这个主题的信息吗(例如,在Linux中运行mono/.NET可执行文件)?没有——它没有给出任何相关信息。关于如何在安装了mono的linux上运行.exe文件的老生常谈(就像我上面提到的)——但没有任何关于mono生成的.exe文件为什么要直接在linux命令行上运行的内容——就好像它是在工作环境中直接生成的本机二进制文件一样。这很奇怪。我以前在Linux上构建过很多小玩具.net/mono项目。。。。但在可执行文件之前,总是必须在bash命令行中提到“mono”——比如:$mono-example.exe一个快速的Goolge证明了这一点:。请参阅“将.exe注册为非本机二进制文件(仅限Linux)”一章。请注意,这不是Mono特性,而是Linux的binfmt子系统启用的功能。(但不要问我关于binfmt的事,我(还)不是一个真正的Linux用户;-)哦,哇,谢谢@elgonzo--这是Linux内核的一个特性--我怎么会怀念多年来作为Linux用户和C爱好者的日子呢。我想,我从未尝试过直接执行.exe文件。。。因此从未注意到。我认为ArchLinux上的mono安装过程会自动激活这个binfmt。我们必须深入挖掘。再次感谢---只需将您的评论复制粘贴到答案中,这样我就可以将其标记为正确答案了。:)回答如下。想一想,我想问题/答案是在家里有一个更好的家(因为它不是真正的编程相关,而是关于系统配置)。所以,如果一个国防部把你的问题转移到那里,不要惊讶(也许不会发生,谁知道呢…)
:CLR:M::MZ::/usr/bin/mono: