.NET 运行时 (CLR)、JIT 编译器究竟位于何处?

Where exactly is .NET Runtime (CLR), JIT Compiler located?

这个问题可能看起来有点愚蠢或奇怪,但我听说过很多关于 .NET CLR、JIT 编译器及其工作原理等等等等......但现在我想知道它的确切位置或托管位置.

是吗-

我正在寻找这方面的详细答案。有人可能会将此问题描述为“Windows 操作系统如何 triggers/executes .NET 可执行文件在 .NET 运行时内?

How Windows Operating System triggers/executes .NET Executable Runs inside .NET Runtime?

每个 .NET 管理的程序集或可执行文件都有特殊的 CLR headers,您可以通过在 ILDASM 中查看程序集来了解这一点。这个headers指向需要加载的runtime的版本。此外,还有带有 Import Address Table 的图像部分,指向需要加载的内容:

----- Image sections:
Import Address Table
DLL : mscoree.dll
          0x00002000 Import Address Table
          0x0000a37e Import Name Table
          0          Time Date Stamp
          0          Index of First Forwarder Reference

          0x0000  _CorDllMain

 ----- CLR Header:
 Header size:                        0x00000048
 Major runtime version:              0x0002
 Minor runtime version:              0x0005
 0x00003184 [0x00007078] address [size] of Metadata Directory:        
 Flags:                              0x00000001
 Entry point token:                  0x00000000
 0x00000000 [0x00000000] address [size] of Resources Directory:       
 0x00000000 [0x00000000] address [size] of Strong Name Signature:     
 0x00000000 [0x00000000] address [size] of CodeManager Table:         
 0x00000000 [0x00000000] address [size] of VTableFixups Directory:    
 0x00000000 [0x00000000] address [size] of Export Address Table:      
 0x00000000 [0x00000000] address [size] of Precompile Header:   

当操作系统 运行 时,加载 mscoree.dll(或 The Shim),它是 clr.dllclrjit.dll for .NET 4.0 的引导程序及更高版本,或 mscordacwks.dllmscorjit.dll(对于 .NET 2.0 或更低版本),它们分别是运行时和 JIT。可以看到本机dll入口点被指示为class库的_CorDllMain方法,以及可执行文件的_CorExeMain,负责入口的加载和jitting观点。他们反过来会在托管环境中调用您的应用程序入口点。

这是根据我的理解,会引导你走向你的答案,但可能不会完全冲出来。

构成 DotNet 运行时(CLR 等)的 EXE/DLL 文件位于以下位置:

C:\Windows\Microsoft.NET\Framework   // for the 32 bit runtime
C:\Windows\Microsoft.NET\Framework64 // for the 64 bit runtime

在那里,您有不同的版本,例如 2.0.50727、3.0、3.5 和 4.0.30319(今天我系统上的版本)。

这是 MSBuild 以及向 IIS 注册的文件所在的位置,运行 来自。

我不知道这是否最终由 Windows 在 运行 时托管,或者是否有一个实际的 EXE 可以附加到调试器并在任务管理器中查看.

希望这能为您提供更多见解。

where exactly it is located or hosted

它只是一个普通的 DLL,您可以在 C:\Windows\Microsoft.NET\Framework\v4.0.30319\clrjit.dll 中找到它的 x86 版本。 x64 版本位于 Framework64 目录中。 .NET v2 版本有一个不同的名称,mscorjit.dll,可以在 v2.0.50727 目录中找到它。

根本不是"hosted",操作系统完全不知道它的存在。 CLR 知道如何定位和加载它。必然如此,CLR 决定何时启动程序。它只是将 DLL 名称硬编码并使用 LoadLibrary("clrjit.dll") 加载它,使用 GetProcAddress("getJit") 获取工厂函数。您可以在 CoreCLR 源代码中看到一些东西,尽管在那个 CLR 版本中抖动不再是一个单独的 DLL。

您也可以使用资源管理器查看 CLR,同样只是一个普通的 DLL。在 v4 版本中为 clr.dll,在 v2 版本中为 mscorwks.dll 和 mscorsvc.dll。当时有两个不同的垃圾收集器,"wks" 是工作站版本,"svc" 是服务器版本。与 <gcServer> 配置文件条目进行比较。

将问题移至 "how does the CLR get loaded?" 这是 c:\windows\syswow64\mscoree.dll 的工作,当您在 EXE 项目中以 x64 为目标时,您将使用 c:\windows\system32\mscoree.dll .每个 .NET 程序集都有 5 或 9 个字节的非托管代码,跳转到该 DLL。 _CorExeMain 或 _CorDllMain,具体取决于程序集是作为 exe 还是库构建的。 mscoree.dll 查看程序集中的元数据并决定需要加载哪个版本的 CLR 以便正确执行。

还有很多恶作剧在进行,我刚刚发布了您要求的 10,000 英尺视图。如果您对此感兴趣,那么您可能想了解更多有关 custom CLR hosting 的信息,看看幕后的那个人。