.NET运行时(CLR),JIT编译器位于何处?

这个问题可能看起来有点愚蠢或奇怪,但我已经听说了很多关于.NET CLR,JIT编译器以及它是如何工作的等等等等……但现在我想知道它究竟在哪里或托pipe。

是吗 –

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

要么

  • 它是我们可以在任务pipe理器中看到的一些.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时,您将使用c:\​​ windows \ system32 \ mscoree.dll。 每个.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 (或Shim)被加载,它是.NET 4.0及以上版本的clr.dllclrjit.dll的引导程序,或.NET 2.0的mscordacwks.dllmscorjit.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可以附加到调试器,并在任务管理器中查看。

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