这个问题可能看起来有点愚蠢或奇怪,但我听说过很多关于.NET CLR、JIT编译器及其工作原理的信息…… 但现在我想知道它究竟位于何处或托管在哪里。
是在我们实际安装.NET Framework时作为Windows操作系统的一部分托管吗?
还是它是某个.exe文件的一部分,可以在任务管理器中看到?
我正在寻找详细的答案。有人可能会把这个问题表述为“Windows操作系统如何在.NET Runtime内触发/执行.NET可执行文件?”
这个问题可能看起来有点愚蠢或奇怪,但我听说过很多关于.NET CLR、JIT编译器及其工作原理的信息…… 但现在我想知道它究竟位于何处或托管在哪里。
是在我们实际安装.NET Framework时作为Windows操作系统的一部分托管吗?
还是它是某个.exe文件的一部分,可以在任务管理器中看到?
我正在寻找详细的答案。有人可能会把这个问题表述为“Windows操作系统如何在.NET Runtime内触发/执行.NET可执行文件?”
还有很多混乱的事情正在发生,我刚刚发布了你要求的10,000英尺视角。如果您对此感兴趣,那么您可能想了解更多关于自定义CLR托管,以查看幕后的人。
Windows操作系统如何触发/执行.NET运行时内的.NET可执行文件?
每个.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
(或 The Shim)被加载,它是 .NET 4.0及以上版本的clr.dll
和clrjit.dll
,或者.NET 2.0及以下版本的mscordacwks.dll
和mscorjit.dll
的引导程序(Runtime和JIT),来自本机dll入口点的指令将成为类库的_CorDllMain
方法,而可执行文件则为_CorExeMain
,负责加载和编写入口点。然后它们将在托管环境中调用您应用程序的入口点。
这是基于我的理解,将指导您找到答案,但可能不完全详尽。
组成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可以用调试器附加并在任务管理器中查看。
希望这能为您提供更多的见解。