了解 .NET 编译

Understanding .NET compilation

据我了解.NET概念,源代码首先被翻译成程序集(IL代码+元数据),然后在目标机器上用CLR的JIT编译器编译成机器码。 但是,我无法真正将这些概念与我在处理 C# 项目时看到的内容相匹配。 当我构建一个项目时,我得到一个 .exe 文件,我认为它是可执行的机器代码。 IL 存储在哪里?我可以访问它并将其转移到不同的平台吗?到 Linux?

综上所述,有人可以纠正我的理解并解释输出吗?

When I build a project I get an .exe file, which I assume is the executable machine code

这是不正确的。 exe 文件只包含一个小存根,导致 OS 在 .net 运行时加载它。或者对于自包含程序集,我猜它包含整个运行时。无论如何,.exe 文件的其余部分 IL-code 将由运行时加载并编译为机器代码。

On linux 我认为您只是直接调用 .net 运行时,并将程序集作为参数。 IE。 dotnet myAssembly.exe

.net 程序集中没有汇编代码。

.Net 程序转换为 .NET 程序集,它是包含中间字节码的 .exe 或 .dll。参见 CIL

Visual Studio 会将 .NET 程序集放在项目的 /bin 或 /bin/Release 中。您可以更改此路径。

dll 或 .exe 是在引用的文件夹中生成的汇编文件。

两个文件都可以 运行 on linux 只要平台支持框架版本。

完整的 .net 框架仅适用于 windows,但单声道和核心正在移植到 linux。

https://docs.microsoft.com/en-us/dotnet/standard/assembly/