.NET 运行时 (CLR) 和 JIT 编译器位于何处

本文关键字:JIT 编译器 于何处 运行时 CLR NET | 更新日期: 2023-09-27 17:56:04

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

是吗-

  • 当我们实际安装 .NET Framework 时,作为 Windows 操作系统的一部分托管?

  • 它是我们可以在任务管理器中看到的一些.exe的一部分

我正在寻找有关此的详细答案。有人可能会将这个问题描述为"Windows 操作系统如何在 .NET 运行时中触发/执行 .NET 可执行文件?

.NET 运行时 (CLR) 和 JIT 编译器位于何处

它位于或托管的确切位置

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

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

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

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

还有更多的恶作剧正在进行,我刚刚发布了你要求的 10,000 英尺视图。 如果您对此感兴趣,那么您可能想了解有关自定义CLR托管的更多信息,以查看幕后的人。

Windows 操作系统如何触发/执行 .NET 可执行文件运行 在 .NET 运行时中?

每个 .NET 托管程序集或可执行文件都有特殊的 CLR 标头,可以通过在 ILDASM 中查看程序集来查看这些标头。此标头指向需要加载的运行时版本。此外,还有带有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),它是 .NET 4.0 及更高版本clr.dllclrjit.dll或 .NET 2.0 或更低版本mscordacwks.dllmscorjit.dll的引导程序,分别是运行时和 JIT。可以看到,本机 dll 入口点被指示为类库的_CorDllMain方法,_CorExeMain为可执行文件,后者负责入口点的加载和抖动。反过来,它们将在托管环境中调用应用程序入口点。

这是基于我的理解,将引导您回答,但可能不会完全清除。

组成 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。

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