• .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加载程序集是按需加载的,当用到的时候才会把其加载到应用程序域中。

     

  • 相关阅读:
    忘记Linux用户密码怎么办?
    新建虚拟机并与XShell连接(配置网卡)
    虚拟机U盘挂载
    Linux 创建虚拟机,配置网卡,桥接,连接XShell
    C/C++产生随机数
    举例说明数据结构在网络技术领域和实际生活中的应用
    组合数学--容斥原理&鸽巢原理
    计算机组成原理-好文总结
    八大排序算法
    博客园自定义页面风格设计
  • 原文地址:https://www.cnblogs.com/zhyj/p/5024381.html
Copyright © 2020-2023  润新知