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

Alw*_*mer 28 .net windows

我在接受采访时被问及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的方式.

  • 这是一个更好的答案:http://stackoverflow.com/questions/6605956/what-happens-when-a-net-application-is-started (2认同)

Mat*_*ted 6

虽然我一般同意GregC,但有时这类信息是有用的.但这是一个在接受采访时应该回答的难题(除非是CLR团队:)

网页和博客......

图书...


Chr*_*lor 5

简而言之,已经有一段时间了,所以其中一些可能有点过时了......

对于 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)