.NET Runtime(CLR)、JIT编译器到底位于哪里?

23

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

是在我们实际安装.NET Framework时作为Windows操作系统的一部分托管吗?

还是它是某个.exe文件的一部分,可以在任务管理器中看到?

我正在寻找详细的答案。有人可能会把这个问题表述为“Windows操作系统如何在.NET Runtime内触发/执行.NET可执行文件?”


请参考 https://dev59.com/3F0a5IYBdhLWcg3waH7j#30377175,了解DNX的工作原理以及与.NET运行时的区别...与问题相关。 - xanatos
2
@xanatos 嗯,如果你想成为精灵中的一员,我得说这非常重要。 - atlaste
如果您需要问这些问题,建议您阅读CLR的相关资料。以下这本书是经得起时间考验的好书:http://www.amazon.com/CLR-via-Edition-Developer-Reference/dp/0735667454 - Jeremy Thompson
3个回答

27
它只是一个普通的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版本中Jitter不再是单独的DLL。您也可以通过资源管理器查看CLR,同样只是简单的DLL。它在v4版本中为clr.dll,在v2版本中为mscorwks.dll和mscorsvc.dll。每个.NET程序集都有5或9个字节的非托管代码,跳转到mscoree.dll。 mscoree.dll查看程序集中的元数据,并决定需要加载哪个CLR版本,以便可以正确执行它。当您在EXE项目中针对x64时,将使用c:\ windows \ system32 \ mscoree.dll,将x86指向c:\ windows \ syswow64 \ mscoree.dll。

还有很多混乱的事情正在发生,我刚刚发布了你要求的10,000英尺视角。如果您对此感兴趣,那么您可能想了解更多关于自定义CLR托管,以查看幕后的人。


21

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

每个.NET托管程序集或可执行文件都有特殊的CLR头,您可以通过在ILDASM中查看程序集来查看这些头。这些头指向需要加载的运行时版本。此外,还有一个带有导入地址表的图像部分,指向需要加载的内容:

----- 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的引导程序(Runtime和JIT),来自本机dll入口点的指令将成为类库的_CorDllMain方法,而可执行文件则为_CorExeMain,负责加载和编写入口点。然后它们将在托管环境中调用您应用程序的入口点。


0

这是基于我的理解,将指导您找到答案,但可能不完全详尽。

组成DotNet Runtime(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可以用调试器附加并在任务管理器中查看。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接