知识大全 用Coding证明Application Domain

Posted

篇首语:瞄准还不是射中,起跑还不算到达。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 用Coding证明Application Domain相关的知识,希望对你有一定的参考价值。

用Coding证明Application Domain  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  Application Domain可以看作是一个Assembly的逻辑容器 在程序执行过程中 如果遇到需要的Type并没有定义在已经加载的Assemblies中 CLR会把相应的Assembly加载的该Application Domain中 每个Application Domain都有一个属于自己的加载器堆(Loader Heap) 用于维护从Application Domain创建以后所用到的所有的Type 以及这些Type对应的方法表——维护这样一个Mapping 定义在Type中的所有方法和经过JIT编译后x 代码(只考虑 bit处理器)

  Application Domain之间是相互隔离 互不干扰 在一个Application Domain创建的对象不能被另一个Application Domain直接调用 反映在内存分配上面——就是各个Application Domain使用各个独立的内存地址空间 一个对象根据他所对应的类型(如System MarshalByRefObject通过传递引用的方式)或者属性(比如对于定义了System SerializableAttribute的Type采用传递值得方式)以两种不同的方式在Application Domain之间传递——By Reference 和By Value

  这些都是地球人都知道的 NET的基本原理 但是相信很多人没有尝试过通过Coding的方式证明这种机制

  那么现在我们就先来看看我们的Sample

  

  下面是运行结果的Screen Shot

  

  接下来我们来分析这段代码

   我们首先定义个 个不同的Type 他们都一个相同的方法——GetAppDomain()用于获取执行该方法的真正的Application Domain

  GeneralType 一般的Type 没有什么特别

  MarshalByValueType 定义了一个System SerializableAttribute(你也可以通过使它实现 System Runtime Serialization ISerializable Interface来模拟这个Sample) 它将以By Value的方式在不同的Application Domain之间传递

  MarshalByRefType 继承自System MarshalByRefObject 该类型的对象它将以By Reference的方式在不同的Application Domain之间传递

  

  public class GeneralType AppDomain GetAppDomain() return AppDomain CurrentDomain; [Serializable] public class MarshalByValueType public AppDomain GetAppDomain() return AppDomain CurrentDomain; public class MarshalByRefType : MarshalByRefObject public AppDomain GetAppDomain() return AppDomain CurrentDomain;

   在Main()中我们首先创建一个新的Application Domain 并为他指定一个Friendly Name——newAppDomain

  AppDomain appDomain = AppDomain CreateDomain( newAppDomain )

   接着我们分别在这个新建的Appliation Domain中创建我们在 中定义的 个类型的对象——generalObject marshalByValueObject marshalByRefObject 并试着把它传递到当前的Application Domain——Default Application Domain 从运行的结果我们可以看出 当我们传递generalObject的时候 一个Exception被抛出 从Error Message可以开出原因—— Type Artech AppDomainIsolation GeneralType in assembly Artech AppDomainIsolation Version= Culture=neutral PublicKeyToken=null is not marked as serializable 从而我们可以看出 一般的Type是不能在不同的Application之间传递的

  

   通过 证明了标记的System SerializableAttribute属性和继承自System MarshalByRefObject的Type对应的对象是可以在不同的Application Domain之间传递呢 但是他们之间又会有怎样的差异呢?他们是真正的对象呢?还仅仅是位于新建Application Domain中的对象一个代理(Proxy)?我们通过调用定义在System Runtime Remoting中的静态方法 IsTransparentProxy 了解Remoting的人相信对这个方法不会感到陌生 他用于判断某个对象是否是一个Transparent Proxy(在当我们跨Application Domain远程调用一个Remote Object的时候 实际上我们并非直接调用Remote Object的方法 而是通过一个同Client处在同一个Application Domain的Transparent Proxy对象间接地调用远程对象——Transparent Proxy具有一个Remote Object的Reference 可以轻易地找到这个Remote Object 其实在真正的场景中 Client调用Transparent Proxy Transparent Proxy再去调用Real Proxy Real Proxy最终才去调用Remote Object——如果你想进一步地了解Remoting 你可以参照MSDN)

  

  通过运行结果 我们可以看到 MarshalByValueType对象marshalByValueObject IsTransparentProxy方法返回False 而对于MarshalByRefType对象marshalByRefObject则返回 True 这就充分证明了 标记了System SerializableAttribute属性的Type所对应的对象是一个真正意义上的对象 而对于继承自MarshalByRefObject Type 当该Type对应的对象从一个Application Domain传递到另一个Application Domain后 另一个Application Domain获得的仅仅是原来对象的Proxy而已

  我们可以从传递的机制来解释这种差异 当你把System SerializableAttribute属性运用要某个Type 或者让某个Class实现 System Runtime Serialization ISerializable Interface的时候 你实际上是给该Type赋予了一种能力——一种可以序列化成XML的能力(XMLSerializer负责把对象序列化成 XML) 当这种对象从一个Application Domain传递到另一个Application Domain的时候 Object先被序列化成XML 接着把XML传递到另一个Application Domain中 在新的Application Domain中 通过反序列化重新生成一个新的Object——这个新的Object和处于另一个Application Domain已经没有任何关系

  而对于而对于继承自MarshalByRefObject Type的对象 虽然他不能够序列化成XML 但是可以通过传递Reference的方式在Application Domain之间传递 当这种传递实质上是通过在另一个Application创建一个拥有该对象引用的一个Proxy 而这个Proxy依赖一这个处理另一个 Application Domain的真正对象

   上面我们实际上已经说清楚了两个对象传递的差异——By Value 和By Reference 现在我们来进一步验证前面我们说的 我们继续来看看我们的代码

  

  我们通过调用连个对象的GetAppDomain()方法 从而获得真正执行该方法的Application Domain 然后再和当前的Application Domain进行比较 我们发现对于MarshalByValueType对象marshalByValueObject 真正执行操作是在当前的 Application Domain中进行的 而对于MarshalByRefType对象marshalByRefObject 则是我们新建立的Application Domain 这充分证明了当marshalByValueObject传递到新的Application后 生成一个和原来对象一模一样的对象 这个对象具有执行自身操作的能力 而对于marshalByRefObject 由于它只是一个Proxy而已 他只有把对对象的操作请求发送给真正的 位于另一个Application Domain的真正对象(同时他也负责把远程对象的执行结果返回给调用者) 真正的操作实际上是发生在远程对象的Application Domain

  由于marshalByRefObject 依赖于远程对象 所以当我们卸载掉Host远程对象的Application Domain 对marshalByRefObject的任何调用将变得无效 所以这里可以对下面这段代码作出解释

  

cha138/Article/program/ASP/201311/21677

相关参考

知识大全 从linux kernel coding style看php代码规范

  linux内核的编码是一种极端情况  需要清晰明朗以供全世界的开发者学习修改对代码的质量要求较高  相信linus大神在长期接触各种各式代码后脾气会变得更暴躁就比如前段时间在某论坛痛斥C++  节

知识大全 Shell.Application对象使用

Shell.Application对象使用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  创建S

知识大全 ASP.Net的Application

ASP.Net的Application  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在ASPN

知识大全 Application对象与Session对象

ASP讲座之三:Application对象与Session对象  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来

知识大全 application是apply的名词形式吗

application是apply的名词形式吗是的applicationn.适用,应用,运用;申请,请求,申请表格;勤勉,用功;敷用,敷用药applyvt.申请;涂;应用,运用;敷(药);vi.申请,

知识大全 ASP.Net的Application介绍

ASP.Net的Application介绍  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!注这个事件

知识大全 介绍一下JSP中application的用法

介绍一下JSP中application的用法?  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!app

知识大全 ASP Application对象教程

ASPApplication对象教程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在ASPAp

知识大全 DOM、JDOM、DOM4J解析XML实例

DOM、JDOM、DOM4J解析XML实例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  <

知识大全 Data Access Application Block 概述

DataAccessApplicationBlock概述  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下