CLR在程序启动时是否尝试解析[不一定加载]所有依赖程序集? 也就是说,依赖程序集分辨率是按需完成的吗? 请注意,我不是在谈论Assembly.Load * [反射]类型的负载。
答案 0 :(得分:4)
JIT编译器指示加载程序集,以响应将IL转换为机器代码。首先将类型方法调用转换为调用存根函数。调用时,此存根会激活JIT编译器以加载IL(如果需要,它会加载程序集)并进行转换。非常随需。
此过程中的一个问题是通过Ngen.exe运行的程序集,所有.NET框架程序集都是在计算机上安装的。首次加载程序集时会检测到此情况。然后,JIT编译器跳过转换步骤并按原样使用预翻译的机器代码。虽然这将加载程序集生成的所有机器代码,但它仍然是按需的。术语“加载”在这里是相对的,Windows使用内存映射文件将本机映像映射到虚拟内存空间。在代码执行到达尚未映射到RAM的内存页面之前,不会从文件中读取实际字节。技术术语是“页面错误”,它在Taskmgr.exe中可见。
答案 1 :(得分:3)
当需要在该程序集中定义的类型时,将解析依赖程序集。因此,组件按需加载。
答案 2 :(得分:3)
来自here
CLR加载程序加载并初始化 尽可能少的侥幸逃脱。 与Win32加载程序,CLR不同 装载机无法解决和 自动加载下属 模块(或组件)。相反, 从属件加载 只有在实际需要时才需要 需要(与Visual C ++ 6.0一样) 延迟加载功能)。这不仅仅是 加快程序初始化时间 但也减少了 正在运行的资源 程序