我在接受采访时被问及Windows操作系统如何区分常规EXE和.NET EXE。
我的回答是,当构建.NET exe时,编译器会将一些信息放入标题中。信息为PE32或PE32 +。 Windows验证标头以确定是否需要加载加载CLR并执行EXE的MSCOREE.dll。
我的回答是否正确?
答案 0 :(得分:15)
我认为以下两个链接是了解PE文件结构和Windows加载器的好资源。
2002年3月文章的确切引用,我认为可以回答你的问题:
.NET的主要目的 可执行文件是获取特定于.NET的 元数据和信息等信息 中间语言(IL)成 记忆。另外,一个.NET 可执行链接 MSCOREE.DLL 即可。这个DLL是 .NET进程的起点。 加载.NET可执行文件时,其入口点通常是一个小的存根 码。那个存根只是跳到了一个 在MSCOREE.DLL中导出函数 (_CorExeMain或_CorDllMain)。从 在那里,MSCOREE负责,并且 开始使用元数据和IL 可执行文件。这个设置是 类似于Visual中的应用程序方式 使用Basic(在.NET之前) MSVBVM60.DLL。
答案 1 :(得分:5)
虽然我一般同意GregC,但有时候这类信息很有用。但这是一个在接受采访时应该回答的难题(除非是CLR团队:)
网页和博客......
<强>书籍... 强>
答案 2 :(得分:2)
简而言之,已经有一段时间了,所以其中一些可能有点过时......
对于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
答案 3 :(得分:0)
难题。你找到工作了吗? ;-)
我知道已经有一段时间了,但是对于任何寻求答案的人: 答案可以在MSDN的此处找到:https://docs.microsoft.com/en-us/dotnet/framework/unmanaged-api/hosting/corvalidateimage-function
在Windows XP和更高版本中,操作系统加载程序通过检查公共目标文件格式(COFF)头中的COM描述符目录位来检查托管模块。设置的位表示受管模块。如果加载程序检测到托管模块,它将加载MsCorEE.dll并调用_CorValidateImage ...
您可以使用dumpbin /clrheader
(对于本机模块为空)自行检查。
如果考虑到这一点(至少在.NET4 +中),则必须由加载程序在进程开始之前完成(这意味着您不能等待模块调用CLR初始化例程),因为AnyCPU意味着加载程序会动态确定过程的重要性,显然必须在过程开始之前就知道。