所有放置在GAC下的东西都是预编译的(ngened)吗?如果是这样,那么整个.NET都被预编译了,所以CLR无法在运行时进行优化,对吗?
比如,如果你在应用程序中使用List,那么CLR将无法优化List本身,只能优化它在你的应用程序中的使用方式?这不是违背JIT的目的吗,要在运行时获得大量的优化吗?因此,实际上失去了对BCL的所有潜在优化?
所有放置在GAC下的东西都是预编译的(ngened)吗?如果是这样,那么整个.NET都被预编译了,所以CLR无法在运行时进行优化,对吗?
比如,如果你在应用程序中使用List,那么CLR将无法优化List本身,只能优化它在你的应用程序中的使用方式?这不是违背JIT的目的吗,要在运行时获得大量的优化吗?因此,实际上失去了对BCL的所有潜在优化?
不,GAC并没有自动进行预JIT;然而,GAC是预JIT的前提条件。实际上,只有少数内容可以进行预JIT。此外,如果BCL被预JIT,那么这些优化已经被NGEN完成了,因此“失去所有潜在的优化”不成问题。
不,全局程序集缓存没有预编译。
框架的新版本确实有一个优化服务在后台运行,进行一些预编译。但由于它在目标系统上运行,所以它所做的所有预编译都是针对该特定系统进行优化的。
如果从GAC加载程序集,则会跳过强名称验证,因为程序集已经通过验证。 GAC的另一个优点是文件保护(仅限管理员)。
NGEN具有自己的本地映像存储。在没有将程序集放入GAC的情况下使用NGEN几乎没有意义。在这种情况下,加载程序集将导致验证其SN签名,这意味着每次加载程序集时都会重新创建加密哈希。
使用ngen的最佳实践也是将程序集放入GAC中。