.Net 应用程序有一个或多个托管执行体组成,其中每个都带有元数据和托管代码,有些可能没有托管代码。有的时候可以构建没有任何托管代码的执行体,通常可以作为程序集或者应用程序的附属部分例如资源。每个可执行体在.net中成为模块(module).可以创建单模块程序集和多模块程序集,但是每个程序集需要包含一个主模块,在该模块中携带了程序集的标识信息等。

image

CLR处理 程序集主要是2个部分 一个是加载程序(loader)和即时编译器(JIT)

加载程序读取元数据,并在内存中创建类及其成员的内部表示和布局。类只有在引用的地方才会加载,没有引用的时候不会加载处理。加载类的时候同时会进行类型安全检查。JIT则根据loader加载的程序行为结果翻译为对应的机器本地代码JIT只有在被调用的时候才会编译,已经编译的内容会在内存中进行缓存。

对有些性能上面有要求的特殊应用程序也可以使用NGEN工具,将托管的可执行程序从IL预编译为本地代码,可以将预编译代码存储到本地,每个调用JIT的时候可以直接使用预编译版本,原始文件也必须存在。因为会进行对比。

NGEN 使用帮助http://msdn.microsoft.com/zh-cn/library/6t9t5wcf(v=VS.80).aspx

关于NGEN的使用争议http://www.cnblogs.com/flier/archive/2004/07/08/22340.html 

个人认为是否使用这种方式完全看具体应用,不同做法可能在不同应用上面得出不同的性能反应。没有一个绝对的标准做法。