这个问题可能看起来有点愚蠢或奇怪,但我已经听说了很多关于.NET CLR,JIT编译器以及它是如何工作的等等等等……但现在我想知道它究竟在哪里或托pipe。
是吗 –
当我们实际安装.NET框架时,作为Windows操作系统的一部分托pipe?
要么
它是我们可以在任务pipe理器中看到的一些.exe的一部分
我正在寻找关于这个的详细的答案。 有人可能将这个问题作为“如何Windows操作系统在.NET运行时触发/执行.NET可执行文件?
选项卡控制 – 更改为不同的forms(C#)
build议在.NET中创build命令行文本编辑器
在启动时dynamic决定Winforms或Wpf?
c#winforms:确定程序的第一次运行
是否有可用于可移植类库的System.Environment.Machinename的等价物?
Windows安全性自定义loginvalidation
如何以编程方式检查WCF Http / Non-Http Activation组件?
从IntPtr句柄获取Control / Form对象
它在哪里位于或托管
它只是一个普通的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.dll和clrjit.dll的引导程序,或.NET 2.0的mscordacwks.dll和mscorjit.dll或以下,分别是运行时和JIT。 您可以看到,本机dll入口点被指示为类库的_CorDllMain方法,而_CorExeMain表示可执行文件,它负责加载和入口点的入口。 他们反过来将在托管环境中调用您的应用程序入口点。
这是基于我的理解,并会引导你对你的回答,但可能不会完全刷新。
组成DotNet运行时(CLR等)的EXE / DLL文件位于以下位置:
C:WindowsMicrosoft.NETFramework // for the 32 bit runtime C:WindowsMicrosoft.NETFramework64 // for the 64 bit runtime
在那里,你有不同的版本,如2.0.50727,3.0,3.5和4.0.30319(我今天系统上的版本)。
我不知道这是否最终在运行时由Windows托管,或者是否有实际的EXE可以附加到调试器,并在任务管理器中查看。
希望这能为你提供更多的见解。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。