我在接受采访时被问及Windows操作系统如何区分常规EXE和.NET EXE.
我的回答是,当构建.NET exe时,编译器会将一些信息放入标头中.信息为PE32或PE32 +.Windows验证标头以确定是否需要加载加载CLR并执行EXE的MSCOREE.dll.
我的回答是否正确?
小智 16
我认为以下两个链接是了解PE文件结构和Windows加载器的好资源.
2002年3月文章的确切引用,我相信你的问题是:
.NET可执行文件的主要目的是将特定于.NET的信息(如元数据和中间语言(IL))放入内存中.此外,.NET可执行文件链接MSCOREE.DLL.此DLL是.NET进程的起点. 加载.NET可执行文件时,其入口点通常是一小段代码.该存根只是跳转到MSCOREE.DLL(_CorExeMain或_CorDllMain)中的导出函数.从那里,MSCOREE负责,并开始使用可执行文件中的元数据和IL.此设置类似于Visual Basic(.NET之前)中的应用程序使用MSVBVM60.DLL的方式.
虽然我一般同意GregC,但有时这类信息是有用的.但这是一个在接受采访时应该回答的难题(除非是CLR团队:)
网页和博客......
图书...
简而言之,已经有一段时间了,所以其中一些可能有点过时了......
对于 XP 及更高版本,OS 加载程序已增强以检测基于 PE 目录条目的托管程序集,如果目录条目存在,加载程序将自动加载 mscoree.dll 并跳转到 mscoree 中的函数 _CorExeMain(2)对于可执行文件和 _CorDllMain 对于 dll。然后 _CorExeMain 负责加载 CLR 并启动托管代码的执行。
我使用以下内容来提醒自己入口点名称...
C:\Windows\System32>dumpbin -exports mscoree.dll
Microsoft (R) COFF/PE Dumper Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file mscoree.dll
File Type: DLL
Section contains the following exports for mscoree.dll
00000000 characteristics
4AF3AF84 time date stamp Fri Nov 06 07:09:24 2009
0.00 version
17 ordinal base
126 number of functions
123 number of names
ordinal hint RVA name
38 0 0001AAA0 CLRCreateInstance
... Lots of stuff left out...
136 76 00015030 _CorDllMain
138 77 00004DDB _CorExeMain
137 78 0001A981 _CorExeMain2
139 79 0002033B _CorImageUnloading
140 7A 000042D0 _CorValidateImage
24 00008017 [NONAME]
142 00014C4D [NONAME]
Summary
4000 .data
4000 .reloc
1000 .rsrc
40000 .text
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5979 次 |
| 最近记录: |