.NET 运行时 (CLR) 和 JIT 编译器位于何处
本文关键字:JIT 编译器 于何处 运行时 CLR NET | 更新日期: 2023-09-27 17:56:04
这个问题可能看起来有点愚蠢或奇怪,但我听说过很多关于.NET CLR,JIT编译器及其工作原理等等等等...但是现在我想知道它究竟在哪里或托管在哪里。
是吗-
- 当我们实际安装 .NET Framework 时,作为 Windows 操作系统的一部分托管?
或
- 它是我们可以在任务管理器中看到的一些.exe的一部分
我正在寻找有关此的详细答案。有人可能会将这个问题描述为"Windows 操作系统如何在 .NET 运行时中触发/执行 .NET 可执行文件?
它位于或托管的确切位置
它只是一个普通的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.dll
和clrjit.dll
或 .NET 2.0 或更低版本mscordacwks.dll
和mscorjit.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。
希望这能为您提供更多见解。