zoukankan      html  css  js  c++  java
  • .Net 程序集按需加载机制

    在开始本文之前先提两个疑问:

    1、一个.Net程序依赖很多的dll,那个他们是在应用程序启动的时候全部把所依赖的动态库全部都加载到应用程序域中的呢还是有选择的加载呢?

    2、当应用程序已经启动后我们动态加载程序集的话,那么该程序集所依赖的程序集是全部加载还是按需加载呢?

    一、分析第一个问题:

    创建三个工程ConsoleApplication1是控制台工程,依赖于类库ClassLibrary1,而ClassLibrary1又依赖于ClassLibrary2工程。 

      

    实验1ConsoleApplication1引用了ClassLibrary1并通过using ClassLibrary1 但是并没有调用ClassLibrary1中的成员,打印出应用程序域中加载的程序集,并没有把ClassLibrary1加载进来 

    实验2:把实验1中的注释去掉调用ClassLibrary1Class1.Print()方法,并把断点设置在该方法上,阻止方法执行,打印出应用程序域中加载的程序集,发现ClassLibrary1已经加载j进来了,而Class1引用了CassLibrary2,但CassLibrary2并没有加载

    进入Class1.Print()方法,打印出应用程序域中加载的程序集,发现ClassLibrary2已经加载j进来了

    实验1、实验2证明应用程序启动后clr加载dll是按需加载的,当进入一个方法的时候,即使没有执行该方法内的任何代码,都会收集该方法内部用到的所有类型,并加载相应类型所在的dll

    二、分析第二个问题:

    还是上面的三个工程,改变依赖关系。ConsoleApplication1不依赖于ClassLibrary1ClassLibrary2,而ClassLibrary1 依然依赖ClassLibrary2

    ConsoleApplication1要通过Assembly.LoadFrom加载ClassLibrary1观察域中的程序集。

    实验1ConsoleApplication1项目通过Assembly.LoadFrom的方式手动加载程序集ClassLibrary1.dll,并没有执行其中的代码,打印出应用程序域中加载的程序集,发现ClassLibrary1已经加载j进来了,但ClassLibrary1所引用的ClassLibrary2并没有加载进来

     

    继续执行通过反射调用Class.Printff方法,打印出应用程序域中加载的程序集,发现ClassLibrary2已经加载j进来了

    由此可见动态加载程序集,在没有调用程序集内部成员的情况下 只加载本身,当调用内部成员的时候加载规则和clr自动加载dll是一样的。

    结论:clr加载程序集是按需加载的,当用到的时候才会把其加载到应用程序域中。

     

  • 相关阅读:
    windows下安装php5.5的redis扩展
    redis常见命令
    HDU 5869 Different GCD Subarray Query
    WA时查错点
    HDU 3333 Turing Tree
    HDU 5868 Different Circle Permutation
    AcWing 272 最长公共上升子序列 (dp)
    中国计量大学现代科技学院第四届“中竞杯”程序设计校赛 I 题 (双端队列bfs / 优先队列bfs)
    AtCoder ARC 109 D (拆点 + 分类讨论)
    codeforces 1408D. Searchlights (暴力 + 前缀优化)
  • 原文地址:https://www.cnblogs.com/zhyj/p/5024381.html
Copyright © 2011-2022 走看看