.Net 程序集按需加载机制
在开始本文之前先提两个疑问:
1、一个.Net程序依赖很多的dll,那个他们是在应用程序启动的时候全部把所依赖的动态库全部都加载到应用程序域中的呢还是有选择的加载呢?
2、当应用程序已经启动后我们动态加载程序集的话,那么该程序集所依赖的程序集是全部加载还是按需加载呢?
一、分析第一个问题:
创建三个工程ConsoleApplication1是控制台工程,依赖于类库ClassLibrary1,而ClassLibrary1又依赖于ClassLibrary2工程。

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

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

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

实验1、实验2证明应用程序启动后clr加载dll是按需加载的,当进入一个方法的时候,即使没有执行该方法内的任何代码,都会收集该方法内部用到的所有类型,并加载相应类型所在的dll。
二、分析第二个问题:
还是上面的三个工程,改变依赖关系。ConsoleApplication1不依赖于ClassLibrary1和ClassLibrary2,而ClassLibrary1 依然依赖ClassLibrary2
ConsoleApplication1要通过Assembly.LoadFrom加载ClassLibrary1观察域中的程序集。

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

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

由此可见动态加载程序集,在没有调用程序集内部成员的情况下 只加载本身,当调用内部成员的时候加载规则和clr自动加载dll是一样的。
结论:clr加载程序集是按需加载的,当用到的时候才会把其加载到应用程序域中。
.Net 程序集按需加载机制的更多相关文章
- 基于python的opcode优化和模块按需加载机制研究(学习与个人思路)(原创)
基于python的opcode优化和模块按需加载机制研究(学习与思考) 姓名:XXX 学校信息:XXX 主用编程语言:python3.5 个人技术博客:http://www.cnblogs.com/M ...
- jvm系列(一):java类的加载机制
java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装 ...
- Crystal框架配置参数加载机制详解?
前言 定义 配置参数定义的形式 配置参数文件定义在哪里? 配置参数加载的优先级 如何使用配置参数? 最佳实践 Jar项目中如何定义配置参数? War项目中如何定义或重载Jar包中的配置参数? 开发人员 ...
- Java ClassLoader加载机制
一.体系结构(自上向下) 1.Bootstrap ClassLoader(BootStrapClassLoader) --- 启动类加载器或者叫引导类加载器,加载jdk核心的APIs,这些APIs一般 ...
- 【webpack整理】一、安装、配置、按需加载
如果你: 是前端热爱者 :) 有JavaScript/nodejs基础 会使用一些常用命令行,mkdir,cd,etc. 会使用npm 想对webpack有更深的认识,或许此时你恰好遇到关于webpa ...
- jvm系列 (五) ---类的加载机制
类的加载机制 目录 jvm系列(一):jvm内存区域与溢出 jvm系列(二):垃圾收集器与内存分配策略 jvm系列(三):锁的优化 jvm系列 (四) ---强.软.弱.虚引用 我的博客目录 什么是类 ...
- 深入java虚拟机学习 -- 类的加载机制
当看到"类的加载机制",肯定很多人都在想我平时也不接触啊,工作中无非就是写代码,不会了可以百度,至于类,jvm是怎么加载的我一点也不需要关心.在我刚开始工作的时候也觉得这些底层的内 ...
- JVM-01:类的加载机制
本文从 纯洁的微笑的博客 转载 原地址:http://www.ityouknow.com/jvm.html 类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内 ...
- Android 的 so 文件加载机制
本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 最近碰到一些 so 文件问题,顺便将相关知识点梳理一下. 提问 本文的结论是跟着 System.loadlibrary() 一层层源 ...
随机推荐
- pentaho cde 选择性的显示多列数据
在业务需求中,有时候会有这种需要,就是查出来可多列数据,而我只想画出来其中的一列或者说某一列,而pentaho会默认画出查出来的所有数据,而不断的更改数据源又太麻烦,这时就要用到resders方法了. ...
- 十五天精通WCF——第三天 client如何知道server提供的功能清单
通常我们去大保健的时候,都会找姑娘问一下这里能提供什么服务,什么价格,这时候可能姑娘会跟你口述一些服务或者提供一份服务清单,这样的话大 家就可以做到童嫂无欺,这样一份活生生的例子,在wcf中同样是一 ...
- 【Linux】将Oracle安装目录从根目录下迁移到逻辑卷
[Linux]将Oracle安装目录从根目录下迁移到逻辑卷 1.1 BLOG文档结构图 1.2 前言部分 1.2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到 ...
- MySQL数据类型——数值类型
1.1.1 整型 整型 占用字节 范围 范围 tinyint 1 -27~27-1 -128~127 smallint 2 -215~215-1 -32768~32767 mediumint 3 -2 ...
- Managed DirectX中的DirectShow应用(简单Demo及源码)
阅读目录 介绍 准备工作 环境搭建 简单Demo 显示效果 其他 Demo下载 介绍 DirectX是Microsoft开发的基于Windows平台的一组API,它是为高速的实时动画渲染.交互式音乐和 ...
- Open Auth辅助库(使用ImitateLogin实现登录)
网络上越来越多的公司进行着自己的平台化策略,其中绝大多数都已Web API的方式对外提供服务,为了方便的使用这些服务,你不得不引用许多相关的类库,但是API的本质其实仅仅是一些约定的网络请求,我们大多 ...
- C#调用自定义表类型参数
-SQL SERVER生成测试环境: --创建测试DB CREATE database Sales; go USE Sales GO --创建表类型 IF TYPE_ID('LocalDT') IS ...
- innoDB源码分析--缓冲池
最开始学Oracle的时候,有个概念叫SGA和PGA,是非常重要的概念,其实就是内存中的缓冲池.InnoDB的设计类似于Oracle,也会在内存中开辟一片缓冲池.众所周知,CPU的速度和磁盘的IO速度 ...
- android 设置布局为无标题样式
<!-- Application theme. --> <style name="AppTheme" parent="android:Theme.Lig ...
- 新手ui设计师必备——切图规范
图文并茂,浅显易懂. 使用markman标注. 资源链接: 图片来自http://www.ui.cn/detail/56347.html 本文作者starof,因知识本身在变化,作者也在不断学习成长, ...