究竟是.NET Runtime(CLR),JIT编译器位于何处?

Par*_*ram 19 .net c# windows clr jit

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

是吗 -

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

要么

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

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

Han*_*ant 21

它的确切位置或托管位置

它只是一个普通的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时,你将使用c:\​​ windows\system32\mscoree.dll.每个.NET程序集都有5或9个字节的非托管代码,跳转到该DLL._CorExeMain或_CorDllMain,取决于程序集是作为exe还是库构建的.mscoree.dll查看程序集中的元数据并确定需要加载的CLR版本,以便正确执行.

还有更多的恶作剧,我刚刚发布了你要求的10,000英尺的视图.如果您对此感兴趣,那么您可能想要了解有关自定义CLR托管的更多信息,以便了解窗帘后面的人.


Yuv*_*kov 19

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:   
Run Code Online (Sandbox Code Playgroud)

当由操作系统,运行mscoree.dll(或垫片)被加载,并且它是引导程序clr.dllclrjit.dll用于与上述.NET 4.0,或mscordacwks.dllmscorjit.dll为或低于NET 2.0,分别运行时和JIT,.您可以看到本机dll入口点被指示为_CorDllMain类库的方法,以及_CorExeMain可执行文件,它负责加载和控制入口点.反过来,它们将在托管环境中调用您的应用程序入口点.