代码之家  ›  专栏  ›  技术社区  ›  AlwaysAProgrammer

windows如何区分常规exe和.net exe?

  •  26
  • AlwaysAProgrammer  · 技术社区  · 16 年前

    在一次采访中,我被问到windows操作系统如何区分普通的exe和.netexe。

    我的回答是,当生成.net exe时,编译器会将一些信息放入头文件中。信息是PE32或PE32+。Windows验证头以确定是否需要加载mscoree.dll,该文件加载CLR并执行EXE。

    我的回答对吗?

    4 回复  |  直到 7 年前
        1
  •  5
  •   Matthew Whited    9 年前

    尽管我同意 GregC 一般来说,有时这类信息是有用的。但这是一个很难在面试中回答的问题(除非是对CLR团队而言:)

    网页和博客…

    书。。。

        2
  •  15
  •   Peter Mortensen Pieter Jan Bonestroo    16 年前

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

    2002年3月文章的确切引述是,我相信它回答了你的问题:

    .net的主要目的 可执行文件是获取特定于.NET的 元数据和 中间语言 记忆。此外, A.NET 针对的可执行链接 McRay.DLL . 此dll是 .NET进程的起点。 当加载.NET可执行文件时,其入口点通常是 代码。那个存根只是跳到一个 mscoree.dll中导出的函数 (_corexemain或_cordlmain) . 从 在那里,mscoree负责,并且 开始使用元数据和来自 可执行文件。此设置是 类似于可视化应用程序 基本(在.net之前)使用 msvbvm60.dll。

        3
  •  2
  •   Chris Taylor    16 年前

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

    对于xp和更高版本,操作系统加载程序经过增强,可以基于pe目录项检测托管程序集,如果目录项存在,加载程序将自动加载mscoree.dll,并跳转到mscoree中的函数,_corexemain(2)用于可执行文件,而_cordlmain用于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
    
        4
  •  0
  •   Eli Finkel    7 年前

    这个问题很难回答。你得到那份工作了吗?;-)

    我知道已经有一段时间了,但是对于任何想要答案的人来说: 答案可以在MSDN中找到: https://docs.microsoft.com/en-us/dotnet/framework/unmanaged-api/hosting/corvalidateimage-function

    在WindowsXP和更高版本中,操作系统加载程序通过检查公共对象文件格式(COFF)头中的COM描述符目录位来检查托管模块。设置位表示托管模块。如果加载程序检测到托管模块,则加载mscoree.dll并调用CorValidateImage…

    你可以自己查一下 dumpbin /clrheader (对于本机模块为空)。

    如果您考虑一下(至少在.net4+中),这必须在进程启动之前由加载程序完成(这意味着您不能等待模块调用CLR初始化例程),因为anyCPU意味着加载程序动态地确定进程的位,这显然必须在重新开始这个过程。

    推荐文章