这个问题可能看起来有点愚蠢或奇怪,但我听说过很多关于.NET CLR,JIT编译器以及它是如何工作的等等等等等等......但现在我想知道它的确切位置或托管位置。
是吗 -
OR
我正在寻找关于此的详细答案。有人可能将这个问题描述为“Windows运行时如何触发/执行.NET Runtime中的.NET可执行文件?
答案 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.dll
和mscordacwks.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,您可以使用调试器附加,并在任务管理器中查看。
希望这能为您提供更多见解。