Han*_*ant 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英尺的视图.如果您对此感兴趣,那么您可能想要了解有关自定义CLR托管的更多信息,以便了解窗帘后面的人.
Yuv*_*kov 19
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:
Run Code Online (Sandbox Code Playgroud)
当由操作系统,运行mscoree.dll(或垫片)被加载,并且它是引导程序clr.dll和clrjit.dll用于与上述.NET 4.0,或mscordacwks.dll和mscorjit.dll为或低于NET 2.0,分别运行时和JIT,.您可以看到本机dll入口点被指示为_CorDllMain类库的方法,以及_CorExeMain可执行文件,它负责加载和控制入口点.反过来,它们将在托管环境中调用您的应用程序入口点.