CLR via C#第22章:跨越AppDomain边界访问对象

.net 使用AppDomain 来隔离对象。这也是它的唯一使命。

  • 注意:
  • 一个进程中可以有多个AppDomain。在操作系统看来,应用程序还是使用进程来隔离不同应用程序的。AppDomain是透明的,是CLR实现的一个功能而已。而线程是可以访问不同AppDoamn的。线程和AppDomain之间是存在一对一的关系的。虽然线程同一时间只能访问一个AppDomain。
  • 每一个AppDomain中都会有一个Loader堆。用于存放自从AppDomanin创建以来访问的类型。(AppDoman刚开始创建时是空的)。除此之外,每个AppDomain都加载了一些程序集。

跨越AppDomain边界访问对象有三种封送方式:

注: 

 首先创建一个新的AppDoman,然后在这个AppDoman中引用需要的程序集,然后在创建响应的类型对象。这就是AppDomain的公共方法CreateInstanceAndUnwrap()方法所需要做的事情。调用这个方法时,线程从默认的AppDomain中转移到新创建的AppDoman中。将新的AppDomain需要的程序集加载进去(调用中).结束后返回默认的AppDomain中,并返回对象的引用。(此处实际上跨AppDomain了,因为AppDomain的隔离性不允许引用另外一个AppDomain中创建的对象).

实际上,a:这个引用对象是从基类MarshalByRefObject派生过来的,b:CLR发现有跨AppDomain引用对象时,会在目标AppDomain中的Loader堆中定义一个代理类型,这个代理类型是用原始类型的元数据定义的,因此,他看起来和原始类型完全一样。有完全一样的实例成员,但是实例字段不会成为代理的一部分(访问字段时会用反射),创建好代理类型后,会创建这个代理类型的一个实例,并初始化它的字段来标识源AppDomain和真实对象,然后将这个代理对象的引用返回目标AppDomain。

  1. “按引用封送”
  2. “按值封送”
  3. “不能封送” 

猜你喜欢

转载自blog.csdn.net/maoxiaohai123/article/details/86595783
今日推荐