【问题标题】:Where exactly is .NET Runtime (CLR), JIT Compiler located?.NET 运行时 (CLR)、JIT 编译器到底在哪里?
【发布时间】:2015-08-28 09:59:45
【问题描述】:

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

是吗-

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

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

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

【问题讨论】:

标签: c# .net windows clr jit


【解决方案1】:

它的确切位置或托管位置

它只是一个普通的 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。

您也可以使用 Explorer 查看 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 英尺视图。如果您对此感兴趣,那么您可能想了解更多关于 custom CLR hosting 的信息,看看幕后的那个人。

【讨论】:

    【解决方案2】:

    这是基于我的理解,将引导您做出回答,但可能不会完全消失。

    构成 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,您可以使用调试器附加到并在任务管理器中查看。

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

    【讨论】:

      【解决方案3】:

      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)被加载,它是 clr.dllclrjit.dll 的引导程序(对于 .NET 4.0 及更高版本,或 mscordacwks.dllmscorjit.dll 对于.NET 2.0 或更低版本,分别是运行时和 JIT。可以看到,native dll入口点被指示为类库的_CorDllMain方法,可执行文件的_CorExeMain,负责入口点的加载和jitting。反过来,它们将在托管环境中调用您的应用程序入口点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-18
        • 1970-01-01
        • 2015-03-23
        • 1970-01-01
        • 1970-01-01
        • 2014-07-20
        • 2017-07-04
        • 1970-01-01
        相关资源
        最近更新 更多