Windows如何区分常规EXE和.NET EXE?

我在面试中被问到Windows操作系统是如何区分常规的EXE和.NET EXE的。

我的回答是,当一个.NET EXE编译时,编译器会在头文件中放入一些信息。 信息是PE32或PE32 +。 Windowsvalidation标题确定是否需要加载加载CLR的MSCOREE.dll并执行EXE。

我的答案是否正确?

Solutions Collecting From Web of "Windows如何区分常规EXE和.NET EXE?"

虽然我一般同意格雷格(GregC)的观点 ,但有时候这种类型的信息是有用的。 但是,这是一个很难回答的问题,除非是CLR团队:)

网页和博客…

  • 便携式可执行文件(维基百科)

图书…

  • 专家的.NET 2.0 IL汇编 (我认为这是一本很好的书)

我认为以下两个链接是理解PE文件结构和Windows加载器的好资源。

  • 深入了解Win32可移植可执行文件格式 (MSDN Mag Feb 2002)
  • 深入了解Win32可移植可执行文件格式,第2部分 (MSDN Mag Mar 2002)

2002年3月的文章,我相信你的问题的确切答案是:

.NET可执行文件的主要用途是将特定于.NET的信息(如元数据和中间语言(IL))存储到内存中。 此外, 一个.NET可执行文件链接到MSCOREE.DLL 。 这个DLL是.NET进程的起点。 当.NET可执行文件加载时,其入口点通常是一小段代码。 该存根仅跳转到MSCOREE.DLL中的导出函数(_CorExeMain或_CorDllMain) 。 从那里,MSCOREE负责,并开始使用可执行文件中的元数据和IL。 此设置与Visual Basic(.NET之前)中的应用程序使用MSVBVM60.DLL的方式类似。

简而言之,它已经有一段时间了,所以这可能有点过时了。

对于XP和更高版本,操作系统加载器被增强,以检测基于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