PE和MSIL之间的主要区别是什么?为什么我们在默认情况下使用JIT编译器时显式使用ILASM,NGEN.EXE?

时间:2014-07-14 07:10:42

标签: .net .net-framework-version

MSIL的概念保存在PE格式的PE文件中让我感到困惑。 我们为什么要使用ILASM.exe生成PE文件和NGEN.EXE生成本机代码,当我们有一个JIT编译器本身可以自己做两个?

1 个答案:

答案 0 :(得分:3)

在Windows上使用PE文件格式来存储可执行代码,DLL和EXE文件。它是一种非常灵活的格式,它可以包含许多不仅仅是代码的东西。 .NET漏洞利用的一种功能,.NET程序集是一个只有5个字节代码的PE文件。其余的都是数据。您可以将它与Java .jar文件进行比较。该数据是标识所需运行时版本的标头。一大块元数据,用于描述程序集中的类型。还有一大块MSIL,即在运行时即时编译为机器代码的中间代码。

您不需要ilasm.exe来生成此类文件。任何.NET编译器都知道如何创建一个。在引擎盖下,它们都使用相同的低级api来编写程序集。

Ngen.exe是可选的,它可以帮助改善程序的热启动,并且不需要及时将MSIL编译为机器代码。 Ngen没有在运行时这样做,而是提前做到了。生成的机器代码存储在c:\ windows \ assembly中的文件中。 CLR将在您运行程序时找到它,并将使用文件中的机器代码绕过jitting步骤。元数据仍然需要原始程序集。

关键是ngen.exe是可选的。提前编译 not 总是更好,它实际上使程序的冷启动变慢,因为它需要CLR来查找额外的文件。冷启动时间由磁盘控制,它们很慢。