c# - .NET 运行时 (CLR)、JIT 编译器究竟位于何处?

标签 c# .net windows clr jit

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

是吗-

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

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

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

最佳答案

where exactly it is located or hosted

它只是一个普通的 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 英尺 View 。如果您对此感兴趣,那么您可能想了解更多关于 custom CLR hosting 的信息看到窗帘后面的那个人。

关于c# - .NET 运行时 (CLR)、JIT 编译器究竟位于何处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30802270/

相关文章:

c# - 在南希测试自定义 Bootstrap

c# - 在验证文本框/复选框之前,文本框/复选框的数据绑定(bind)值不正确

c# - Expression.PropertyOrField 可以用于访问静态属性或字段吗?

c# - 带有 SQL Server 数据库和 Entity Framework 错误的 Windows 应用程序部署

windows - excel 函数 ARBEITSTAG 在英文版 Excel 中不起作用

c# - 图像 split 成 9 block

c# - 如何在 C# WinForms 按钮中左右对齐文本?

c# - 执行SSIS包

c++ - 我应该使用 std::system 来编写单元测试的脚本部分吗?

windows - Windows 上的 flutter : how to call an external dll?