Programming Life

.NET World

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
记得在一次Presentation中,有人问及能否对NGen生成的文件进行Reflection,我回答说可以。其实这种说法是不正确的。
1)NGen生成的是本机代码,本机代码可以反射吗?不能。C++是直接生成本机代码的,它没有反射机制。一个重要的原因:没有元数据(Metadata)。
2)不过,若我们有一个程序集c:\temp\a.dll,通过NGen,可以把它生成本机代码。但注意,生成的本机代码不是把c:\temp\a.dll变成本机代码,而是把生成的本机代码放在一个特有的目录下,比如:C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\a\dc7997d6c6cb7f428462eb7545809b4c\a.ni.dll。当CLR去加载a.dll(如通过反射)时,CLR首先检查是否有一个对应的由NGen生成的本机代码存在,如果有就绕过JIT,否则会启动JIT进行编译。
3)我当时特别强调这只是编译模型的改变,NGen还是要与原来的程序集一起分发,因为CLR是通过元数据来进行代码管理的,如垃圾回收,代码验证等。倘若只有本机代码,CLR将不知所措。事实上,用NGen生成的代码还存在诸多问题如加载时的性能问题,执行时的性能问题,文件的同步等4)NGen主要用于加快应用程序的启动速度,尤其是将应用程序安装到用用户的机器上时,调用NGen生成本地代码。
posted on 2007-04-21 13:14  许文科  阅读(1674)  评论(1编辑  收藏  举报