【发布时间】:2020-06-05 22:11:19
【问题描述】:
我有一个非常困惑的问题。我对.NET的理解是这样的:
- C# 应用程序(源代码)->
-
csc.exe(编译器)-> - .NET 应用程序(在 MSIL 中)
如果是这样,为什么构建 .NET 应用程序的输出是 Windows 可执行文件?我认为整个想法是您的源代码编译为 MSIL,它以本地安装的 CLR 为目标。但是,.NET Core 和 .NET 5 都会生成一个 windows 可执行文件,它运行在操作系统之上,而不是在虚拟机中。
这与 Java 不同,Java 编译为 .class 字节码文件(不是 .exe),这些文件确实在虚拟机上运行(或者,稍后,您可以将所有将类文件放入.jar)。
我想问的是:为什么 C# 编译器不生成在 .NET 上运行的特定应用程序文件类型?例如,与公共语言运行时关联的 .net 文件?
我最好的猜测是,生成的 Windows .exe 实际上不是,而是一个 Windows 可执行文件,而是某种 .NET 可执行文件。但是,在那种情况下,为什么它不能在任何带有 .NET Core 的平台上运行呢? Linux 不知道.exe 文件是什么。
【问题讨论】:
-
好问题!尽管需要 JIT 编译器,但许多新开发人员只是认为这是理所当然的,并接受它“正常工作”这一事实,而没有真正调查为什么它可以工作。
-
另外,欢迎来到 .NET 开发!您正在一个激动人心的时刻学习,因为此时开发模型确实非常成熟,具有跨平台和框架的统一开发体验。
-
.NETCore 实际上就是这样工作的。 .jar 的等价物是 .dll,java.exe 的等价物是 dotnet.exe。但是在 18 年的程序员已经习惯了运行 .exe 之后,.NETCore 和 VS 并没有试图过多地破坏苹果车。您运行的 .exe 是“主机”,它的工作是实现 VM。程序员迟早会习惯只分发 .dll,这可能需要一段时间。