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

时间:2015-06-12 11:45:37

标签: c# .net windows clr jit

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

是吗 -

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

OR

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

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

3 个答案:

答案 0 :(得分: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英尺的视图。如果您对此感兴趣,那么您可能想了解更多有关custom CLR hosting的信息,以便了解幕后人员。

答案 1 :(得分:19)

  

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

每个.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

当被操作系统运行时,clr.dll(或Shim)被加载,它是{4.0}及更高版本的clrjit.dllmscordacwks.dll的引导程序,或{{ 1}}和mscorjit.dll适用于.NET 2.0或更低版本,分别是运行时和JIT。您可以看到本机dll入口点被指示为类库的_CorDllMain方法,而_CorExeMain表示可执行文件,它负责加载和点入入口点。反过来,他们将在托管环境中调用您的应用程序入口点。

答案 2 :(得分: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,您可以使用调试器附加,并在任务管理器中查看。

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