日期:2014-05-17  浏览次数:21054 次

C#的可执行程序完全退出程序后再次执行这个EXE文件还要对IL进行即时编译为本地代码吗?
C#的可执行程序每一次运行时都要进行即时编译吗?注是指完全退出程序后再次执行这个EXE文件还要对IL进行即时编译为本地代码吗? 有篇文章这么说内容如下:
再次调用该方法?
  在一个程序中,我们经常反复调用同一个方法,当再次调用该方法时就不需要重复进行验证了,可以直接调用内存块中已有的本地代码,完全跳过JITCompile函数的验证和编译过程。所以同一方法只有在第一次调用时会产生一些性能损失,后续调用就可以全速进行了。
  关闭程序?
  由于编译器将本地代码保存在动态内存中,所以关闭程序时本地代码将发生丢失。当再次启动程序或者同时运行程序的两个实例时,JIT编译器将再次将IL代码编译为本地指令。
 有个网友又说不用再次编译为本地指令,他是这么说:
公共语言运行库支持一种提前编译模式。此提前编译模式使用本机映像生成器 (Ngen.exe) 将 MSIL 程序集转换为本机代码,其作用与 JIT 编译器极为相似。但是,Ngen.exe 的操作与 JIT 编译器的操作有三点不同:它在应用程序运行之前而不是运行过程中执行从 MSIL 到本机代码的转换。它一次编译一个整个的程序集,而不是一次编译一个方法。它将本机映像缓存中生成的代码以文件的形式持久保存在磁盘上。现在我也不知道哪个正确答案!

------解决方案--------------------
2个说的意思应该都是对的
MSIL编译为本机代码

运行 Microsoft 中间语言 (MSIL) 之前,必须先根据公共语言运行库将其编译为适合目标计算机体系结构的本机代码。.NET Framework 提供了两种方式来执行此类转换:

.NET Framework 实时 (JIT) 编译器。

.NET Framework 本机映像生成器 (Ngen.exe)。