zoukankan      html  css  js  c++  java
  • AppDomain 详解一【转】

    AppDomain是CLR的运行单元,它可以加载Assembly、创建对象以及执行程序。
    (CLR:
    C#是一种编程语言,他是运行在CLR上的,CLR提供了他的编译环境。
    CLR,即公共语言运行时,CLR提供了所有类型的应用程序都要使用的编程模型。包括文件加载器,垃圾收集器,安全系统,线程池等。CLR还提供了一个面向对象的编程模型,定义了类型和对象是什么,以及他们的行为方式。
    )
    AppDomain是CLR实现代码隔离的基本机制。
    每一个AppDomain可以单独运行、停止;每个AppDomain有自己默认的异常处理;
    一个AppDomain的运行失败不会影响到其他的AppDomain。
    CLR在被CLR Host(windows shell or InternetExplorer or SQL Server)加载后,要创建一个默认的AppDomain,程序的入口点
    (Main方法)就是在这个默认的AppDomain中执行。
    1.AppDomain vs 进程
    AppDomain被创建在进程中,一个进程内可以有多个AppDomain。一个AppDomain只能属于一个进程。
     
    2.AppDomain vs 线程
    其实两者本来没什么好对比的。AppDomain是个静态概念,只是限定了对象的边界;线程是个动态概念,它可以运行在不同的
    AppDomain。
    一个AppDomain内可以创建多个线程,但是不能限定这些线程只能在本AppDomain内执行代码。
     
    3.AppDomain vs Assembly
    Assembly是.Net程序的基本部署单元,它可以为CLR提供用于识别类型的元数据等等。Assembly不能单独执行,它必须被加载到
    AppDomain中,然后由AppDomain创建程序集中的对象。
    一个Assembly可以被多个AppDomain加载,一个AppDomain可以加载多个Assembly。
    每个AppDomain引用到某个类型的时候需要把相应的assembly在各自的AppDomain中初始化。因此,每个AppDomain会单独保持一
    个类的静态变量。
     
    4.AppDomain vs 对象
    任何对象只能属于一个AppDomain。AppDomain用来隔离对象,不同AppDomain之间的对象必须通过Proxy(reference type)或者
    Clone(value type)通信。
     
    5.AppDomain vs Assembly Code
    AppDomain和程序集的源代码是什么关系呢?每个程序集的代码会分别装载到各个AppDomain中?
    首先我们要把程序集分3类
    1.mscorlib,这是每个.net程序都要引用到的程序集。
    2.GAC,这个是强命名的公用程序集,可以被所有的.net程序引用。
    3.Assembly not in GAC,这是普通的assembly,可以不是强命名,不放到GAC中。
    启动CLR,进入entry point时可以设置LoaderOptimization属性:
    [LoaderOptimization(LoaderOptimization.MultiDomain]
    static void Main()
    {...}
    LoaderOptimization属性可以设置三个不同的枚举值,来设置针对前面说的三种程序集的代码存放以及访问方式。
    LoaderOptimization Enumeration/Attribute
    ValueExpected Domains in ProcessEach Domain Expected to Run ...Code for MSCORLIBCode for Assemblies in GACCode for Assemblies not in GAC
    SingleDomain One N/A Per-process Per-domain Per-domain
    MultiDomain Many Same Program Per-process Per-process Per-process
    MultiDomainHost Many Different Programs Per-process Per-process Per-domain

    1.SingleDomain,由于只启动一个AppDomain,那么code就被直接装载到了AppDomain中,访问静态变量更快捷。
    2.MultiDomain,所有的Assembly代码是进程级别的,因此所有的AppDomain只访问一份代码。这大大减少了程序占用的内存,但
    是由于程序集的静态变量仍然在各个AppDomain中,因此代码访问静态变量需要先得到AppDomain的引用再进行转换,速度会受到
    影响。
    3.MultiDomainHost,只有GAC代码是共享的,非GAC的Assembly依然会加载到被使用的AppDomain中,这样提高了静态变量的访问
    速度,当然也增加了程序占用的内存。 
     
    不管是哪种方式,mscorlib始终是process级别的,即只有一份mscorlib代码在内存中。
  • 相关阅读:
    网站访问量和服务器带宽的选择
    PHP实现四种基本排序算法
    常用的PHP排序算法以及应用场景
    常见的mysql数据库sql语句的编写和运行结果
    MyBatis拦截器:给参数对象属性赋值
    《自律让你自由》摘要
    Java JDK1.5、1.6、1.7新特性整理(转)
    人人都能做产品经理吗?
    Windows下查询进程、端口
    一语收录(2016-09-18)
  • 原文地址:https://www.cnblogs.com/wulala9/p/8478990.html
Copyright © 2011-2022 走看看