【发布时间】:2011-09-27 22:18:13
【问题描述】:
当程序启动时,CLR 是否尝试解析 [不一定加载] 所有依赖程序集? 也就是说,依赖程序集解析是按需完成的吗? 请注意,我不是在谈论 Assembly.Load* [reflective] 类型的负载。
【问题讨论】:
当程序启动时,CLR 是否尝试解析 [不一定加载] 所有依赖程序集? 也就是说,依赖程序集解析是按需完成的吗? 请注意,我不是在谈论 Assembly.Load* [reflective] 类型的负载。
【问题讨论】:
JIT 编译器指导程序集的加载,以响应将 IL 转换为机器代码。类型方法调用首先被转换为调用存根函数。调用时,此存根会激活 JIT 编译器以加载 IL(必要时加载程序集)并翻译它。非常按需。
这个过程中的一个问题是通过 Ngen.exe 运行的程序集,所有 .NET 框架程序集都是在机器上安装时。首次加载程序集时会检测到这一点。 JIT 编译器然后跳过翻译步骤并按原样使用预翻译的机器代码。虽然这将加载程序集生成的所有机器代码,但它仍然是按需的。术语“加载”在这里是相对的,Windows 使用内存映射文件将本机映像映射到虚拟内存空间。在代码执行到达尚未映射到 RAM 的内存页面之前,不会从文件中读取实际字节。技术术语是“页面错误”,它在 Taskmgr.exe 中可见。
【讨论】:
当需要在该程序集中定义的类型时,将解析从属程序集。所以程序集是按需加载的。
【讨论】:
来自here
CLR 加载器加载并初始化 尽可能少地逃脱。 与 Win32 加载程序不同,CLR loader 无法解析并且 自动加载下属 模块(或组件)。而是, 从属件装载在 仅当它们实际上是 需要(与 Visual C++ 6.0 一样) 延迟加载功能)。这不仅 加快程序初始化时间 但也减少了数量 运行消耗的资源 程序。
【讨论】: