代码之家  ›  专栏  ›  技术社区  ›  JL. Hans Passant

.NET执行官是真正的可执行文件吗?

  •  3
  • JL. Hans Passant  · 技术社区  · 15 年前

    我注意到在.NET中,对exe进行反向工程非常容易。这是因为.NET可执行文件仅仅是.NET引擎的指令代码,而且由于.NET是一种解释语言吗?从来没有本地处决过?

    我必须承认,我从来没有对.NET代码有任何性能问题,所以这就是我怀疑的原因。

    有人能给我解释一下吗?

    感谢迄今为止的回答,有人知道为什么微软决定创建这种需要框架的方法吗?如果我记得在VB6代码被编译成本机代码的时候是正确的。有没有很好的理由让.NET代码现在必须通过一个解释器来运行>

    10 回复  |  直到 15 年前
        1
  •  4
  •   dbkk    15 年前

    NET可执行文件包含MSIL(微软中间语言)字节码,类似于Java字节码。它们不是本机Intel32代码,没有安装.NET Framework就无法运行。除了MSIL之外,还包含大量的元数据。可以使用ildasm或reflector查看.NET可执行文件。

    从技术上讲,它们不是解释的,而是编译为机器代码的JIT(只是及时的)。有一种方法可以将它们编译为本机代码ngen.exe实用程序。有时,JIT代码可能比NGEN更快,因为它可以进行运行时分析。

        2
  •  7
  •   Dirk Vollmar    15 年前

    问题应该是什么是“真正的”可执行文件。

    可执行.NET程序集存储在 Portable Executable (pe)格式,它是用于Windows中可执行文件的文件格式之一。

    这是一种包装格式,告诉操作系统执行所包含的代码所需的所有信息。

    从这个意义上讲,.NET可执行文件是完全“真实”的执行器。

    但是,对于.NET程序集,PE格式 extended :

    Microsoft的.NET框架具有 扩展了具有功能的PE格式 支持共同语言 运行时。其中增加了一个clr 头和clr数据段。在 加载二进制文件时,OS加载程序将生成 通过引用执行到clr 在PE/COFF导入表中。CLR 然后加载clr头和数据 部分。

    clr数据部分包含两个 重要部分:元数据和 中间语言(IL)代码:

    • 元数据包含与程序集相关的信息,包括 程序集清单。舱单 详细描述程序集 包括唯一标识(通过 哈希、版本号等),数据 导出组件,扩展类型 信息(由公共部门支持 类型系统(CTS)),外部 参考资料和文件列表 在组件中。CLR 环境广泛利用 元数据。

    • 中间语言(IL)代码是抽象的,独立于语言 满足.NET CLR的代码 通用中间语言 要求。术语“中间人” 指的是IL代码的性质 跨语言和跨平台 兼容的。这个中间人 类似Java字节码的语言, 允许平台和语言 支持公共.NET CLR。伊利诺伊州 支持面向对象编程 (多态性,继承,抽象 类型等)、异常、事件和 各种数据结构。IL码是 组装成.NET PE以执行 由CLR提供。

        3
  •  2
  •   Mike Two    15 年前

    .NET exes与其他可执行文件一样,是PE文件,但它们包含附加的节以在内部包含IL。看最后一篇文章 this thread 查看更多详细信息。

        4
  •  2
  •   Guffa    15 年前

    .exe文件包含表示IL指令的字节代码。当您启动应用程序时,JIT编译器会将其编译成专门为您的处理器创建的本机代码。

    因此,虽然可执行文件不包含本机代码,但执行的是本机代码。由于JIT编译器可以为您的特定处理器优化代码,因此它有可能比在任何处理器上运行生成的本机代码更快。

        5
  •  1
  •   UK-AL    15 年前

    它们是字节码。理论上,字节代码可以比本机代码快,所以不要考虑性能。

        6
  •  1
  •   Maximilian Mayerl    15 年前

    不,它们不是普通的可执行文件。它们包含cli标准中定义的元数据和cil(通用中间语言)指令(参见ecma-335- http://www.ecma-international.org/publications/standards/Ecma-335.htm )

    至于CIL的解释:大多数.NET版本不解释代码,而是JIT(及时)编译代码。这意味着,当一段代码在应用程序运行时第一次使用时,代码被编译为本机代码,并且从此处开始使用本机代码。但这实际上是一个实现细节,例如,据我所知,微观框架在纯解释中。

    关于您在问题中的编辑:

    其原因是,通过在元数据和公共指令集中对代码进行公共表示,可以更容易地以这种方式在不同语言之间进行互操作。

    因为所有的语言在幕后都讲着相同的、常见的“低级”语言,所以它们能够明显地相互集成。

        7
  •  1
  •   Polyfun MicBehrens    15 年前

    当您第一次加载.NET程序集时,字节代码(msil)被编译为本机代码(即时编译),从那时起它作为本机程序集运行。因此.NET程序集是 解释,但当它们第一次被抖动时,您确实会受到一点性能影响。然而,JIT的优点在于JIT编译器可以优化程序集运行的体系结构(CPU指令集等)的汇编程序,而传统的编译时编译(如C++)则不一定如此。

    如果愿意,可以使用NGEN预编译.NET程序集,从而避免JIT开销。

        8
  •  1
  •   PythEch    15 年前

    是的,它们不是“真实的”。您将要创建的exes将被MSIL编码。当您运行某个执行器时,代码将由clr(公共语言运行库)转换为机器代码。

    MSIL代码可以很容易地反编译。你可以使用 .NET Reflector 它是免费的。此外,你可以转换你的代码从C到VB.NET或C++等当你反编译你的exe…

    你也可以尝试 Xenocode Postbuild obfuscator 它使您的exe本机32和模糊,.NET Reflector将无法解压缩您的exe,如果您使用此模糊。但是,这会让你的前男友变得更大一点。)

        9
  •  0
  •   Darin Dimitrov    15 年前

    不解释.NET。当一个代码实际执行时,它是一个本机代码,由于JIT,它是从MSIL编译而来的。可执行文件包含生成本机代码所需的MSIL指令。

        10
  •  0
  •   Nils    15 年前

    作为自由时间- mono -开发人员我倾向于回答您问题的最后一部分(现在是否有非常好的理由让.NET代码通过解释器运行?)以下内容: 是:便携性