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

时间:2010-04-14 15:48:36

标签: .net windows

我在接受采访时被问及Windows操作系统如何区分常规EXE和.NET EXE。

我的回答是,当构建.NET exe时,编译器会将一些信息放入标题中。信息为PE32或PE32 +。 Windows验证标头以确定是否需要加载加载CLR并执行EXE的MSCOREE.dll。

我的回答是否正确?

4 个答案:

答案 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意味着加载程序会动态确定过程的重要性,显然必须在过程开始之前就知道。