我最近需要从 GitHub 上获取的源代码构建一个我需要的程序。该程序是用 C# 编写的 Windows 程序的 Linux 端口。我设法找出了我需要的软件包,例如dotnet-runtime
和dotnet-sdk
,以及其他一些软件包,例如nuget
、mono
和mono-msbuild
。我在下构建并安装了该程序/opt
。
我查看了内部结构。/usr/local/bin/
下面有一个指向 shell 脚本的链接/opt/program/bin/
。shell 脚本运行/opt/program/bin/Program.exe
可执行文件。这是我所期望的,因为它是一个 Windows 可执行文件,但我后来意识到它是通过以下命令执行的(在切换到项目目录后),如下所示
exec bin/Program.Exe
这意味着它不是作为另一个程序的参数运行的。这并非我的预期。我预期 Linux 需要一个监督程序来运行 Windows exe,就像 Java 所需的那样(或者 Wine 之类的程序对真正的 Windows 程序所做的那样)。
然后我确认我可以直接自己运行程序
$ /opt/program/bin/Program.exe
然后我查看了文件,果然,它确实MZ
以前两个字节开头,所以我检查了一下
$ file /opt/program/bin/Program.exe
/opt/program/bin/Program.exe: PE32 executable for MS Windows 4.00 (GUI), Intel i386 Mono/.Net assembly, 3 sections
$
所以这肯定是 MS Windows 可执行文件。为了完整起见,我确实进行了快速搜索,搜索引擎回答说 Linux 本身不运行 Windows 可执行文件(我当然知道这一点)。
我能想到的唯一解释是,当你安装dotnet-runtime
软件包时,会进行某种更改,告诉内核如何执行这些类似于内核以#!/path/to/interpreter
?开头的可执行文件的规则。