System.AppDomain类详解(一)

  AppDomain是CLR(Common Language Runtime:公共语言运行库),它可以加载Assembly、创建对象以及执行程序。

  AppDomain是CLR实现代码隔离的基本机制。

  每一个AppDomain可以单独运行、停止;每个AppDomain都有自己默认的异常处理;一个AppDomain的运行失败不会影响到其他AppDomain的运行。

  CLR在被CLR Host(windows shell or InternetExplorer or SQL Server)加载后,会创建一个默认的AppDomain,程序的入口点(main方法)就是在这个默认的AppDomain中执行。

  1、AppDomain与进程比较:

    AppDomain被创建是在进程中,一个进程中可以有多个AppDomain,但一个AppDomain只能属于一个进程。

  2、AppDomain与线程比较:

    与线程,Appdomain是个静态概念,知识限定了对象的边界;线程是个动态的概念,它可以运行在不同的AppDomain中。一个AppDomain内可以创建多个线程,但是不能限定这些线程只能在本AppDomain内执行代码。

    CLR中的System.Threading.Thread对象其实是个soft thread,它并不能被操作系统识别;操作系统能识别的是hard thread。一个soft thread只属于一个ppDomain,穿越AppDomain的是hard thread。当hard thread访问到某个AppDomain时,一个AppDomain就会产生一个soft thread。

    hard thread有thread local storage(TLS),这个存储区被CLR用来存储hard thread当前对应的AppDomain引用以及soft thread引用。当一个hard thread穿越到另外一个AppDomain时,TLS中的这些引用也会改变。

  3、AppDomain与Assembly的比较:

    Assembly是.net程序的基本部署单元,它可以为CLR提供识别类型的元数据等等。Assembly不能单独执行,必须被加载到AppDomain中,然后由AppDomain创建程序集中的对象。一个Assembly可以被多个AppDomain加载,一个AppDomain可以加载多个Assembly。每个AppDomain引用到某个类型的时候需要把相应的assembly在各自的AppDomain中初始化。因此,每个AppDomain会单独保持一个类的静态变量。

  4、AppDomain与对象的比较:

    任何对象只能属于一个AppDomain,AppDomain用来隔离对象,不同AppDomain之间的对象必须通过Proxy(reference type)或者Clone(value type)通信。

    引用类型需要继承System.MarshalByRefObject才能被Marshal/UnMarshal(Proxy)。
    值类型需要设置Serializable属性才能被Marshal/UnMarshal(Clone)。

  5、AppDomain与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

Value Expected Domains in Process Each Domain Expected to Run ... Code for MSCORLIB Code for Assemblies in GAC Code 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代码在内存中。

  详细参考:http://www.cnblogs.com/foman/archive/2009/10/18/1585655.html

时间: 2024-09-29 08:16:31

System.AppDomain类详解(一)的相关文章

System.AppDomain类详解(二)

进程是存在独立的内存和资源的,但是AppDomain仅仅是逻辑上的一种抽象.一个process可以存在多个AppDomain.各个AppDomain之间的数据时相互独立的.一个线程可以穿梭多个AppDomain. 一.属性 ActivationContext 获取当前应用程序域的激活上下文.ApplicationIdentity 获得应用程序域中的应用程序标识.ApplicationTrust 获取说明授予应用程序的权限以及应用程序是否拥有允许其运行的信任级别的信息.BaseDirectory

URLConnection类详解

为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/3753224.html URLConnection概述 URLConnection是一个抽象类,表示指向URL指定资源的活动连接. URLConnection类本身依赖于Socket类实现网络连接.一般认为,URLConnection类提供了比Socket类更易于使用.更高级的网络连接抽象.但实际上,大多数程序员都会忽略它

Opencart 之 Registry 类详解

Registry 中文意思是记录,登记,记录本的意思, 在opencart中他的用途就是 登记公共类.类的原型放在 system\engine文件夹下 代码很简单: <?php final class Registry { private $data = array(); public function get($key) { return (isset($this->data[$key]) ? $this->data[$key] : NULL); } public function s

Android中内容观察者的使用---- ContentObserver类详解

  转载请注明出处:http://blog.csdn.net/qinjuning 前言: 工作中,需要开启一个线程大量的查询某个数据库值发送了变化,导致的开销很大,后来在老大的指点下,利用了 ContentObserver完美的解决了该问题,感到很兴奋,做完之后自己也对ContentObserver做下总结. ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于 数据库技术中的触发器(Trigger),当ContentObs

java中System.getProperty()方法详解

java中System.getProperty()方法详解,如下: System.out.println("java版本号:" + System.getProperty("java.version")); // java版本号 System.out.println("Java提供商名称:" + System.getProperty("java.vendor")); // Java提供商名称 System.out.println

JAVAEE学习——struts2_01:简介、搭建、架构、配置、action类详解和练习:客户列表

一.struts2是什么 1.概念 2.struts2使用优势以及历史 二.搭建struts2框架 1.导包 (解压缩)struts2-blank.war就会看到 2.书写Action类 public class HelloAction { public String hello(){ System.out.println("hello world!"); return "success"; } } 3.书写src/struts.xml (记得加上dtd约束) &l

QAction类详解:

先贴一段描述:Qt文档原文: Detailed Description The QAction class provides an abstract user interface action that can be inserted into widgets. In applications many common commands can be invoked via menus, toolbar buttons, and keyboard shortcuts. Since the user

Android技术18:Android中Adapter类详解

1.Adapter设计模式 Android中adapter接口有很多种实现,例如,ArrayAdapter,BaseAdapter,CursorAdapter,SimpleAdapter,SimpleCursorAdapter等,他们分别对应不同的数据源.例如,ArrayAdater对应List和数组数据源,而CursorAdapter对应Cursor对象(一般从数据库中获取的记录集).这些Adapter都需要getView方法返回当前列表项显示的View对象.当Model发生改变时,会调用Ba

C++虚基类详解

1.虚基类的作用从上面的介绍可知:如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员.在引用这些同名的成员时,必须在派生类对象名后增加直接基类名,以避免产生二义性,使其惟一地标识一个成员,如    c1.A::display( ).在一个类中保留间接共同基类的多份同名成员,这种现象是人们不希望出现的.C++提供虚基类(virtual base class )的方法,使得在继承间接共同基类时只保留一份成员.现在,将类A声明为