我有一个非常困惑的问题。我对.NET的理解是这样的:
csc.exe
(编译器)->如果是这样,为什么构建.NET应用程序的输出是Windows可执行文件?我认为整个想法是您的源代码可以编译为MSIL,而MSIL是针对本地安装的CLR的。但是,.NET Core和.NET 5均会生成Windows可执行文件,该可执行文件在操作系统之上运行,而不是在虚拟机中运行。
这与Java不同,Java编译为.class
字节码文件(不是.exe
),而这些文件do在虚拟机上运行(或者,以后,您可以将所有类文件打包到[.jar
)。
我想问的是:为什么C#编译器不生成在.NET上运行的特定应用程序文件类型?例如,与公共语言运行时关联的.net
文件?
我的最佳猜测是,生成的Windows .exe
是not,实际上是Windows可执行文件,而是某种.NET可执行文件。但是,在那种情况下,为什么它不能在具有.NET Core的任何平台上运行? Linux不知道.exe
文件是什么。
这是一个常规可执行文件,但其中包含的唯一本机代码是一个小的存根,它将调用.NET运行时。然后,运行时将检查该文件中嵌入的MSIL,然后执行其余操作。
因为Microsoft希望生成的代码可以直接执行。即他们不想要
c:> rundotnet myapp
他们想要
c:> myapp
为什么,因为用户现在必须如何运行某些内容,而不必输入或单击它。因此,他们将IL打包在一个引导程序exe中,该exe加载了.net运行时并进入了IL的主要入口点。
将此与正在运行的Java应用程序进行比较。
注意单声道(在Linux上,您确实做了]
#: mono myapp
尽管后来他们引入了Windows的方法