解析.NET对象的越应用程序域访问(下篇)解析.NET对象的超应用程序域访问(下篇)

   
转眼就交了元宵节,匆匆忙忙的步履是咱当啊生存努力之状,新的同样年,我们当努力让好来非平等的存以及追求。生命不息,奋斗不就。在上篇博文中关键介绍了.NET的AppDomain的相关信息,在本篇博文中将会主要说明.NET程序集、对象代理,以及对象的封送原理。

   
转眼就交了元宵节,匆匆忙忙的步是我们在吗活努力之抒写,新的一致年,我们相应奋力给祥和发生未相同的生和追求。生命不息,奋斗不单单。在上篇博文被举足轻重介绍了.NET的AppDomain的相关信息,在本篇博文中将会主要说明.NET程序集、对象代理,以及对象的封送原理。

一.程序集解析:

   
谈到程序集,就要懂得呀叫程序集,我们看程序集的概念是啊。程序集大体分成两种植:一种植是类库(就是我们看出的.DLL文件);一栽是可执行程序(就是我们看看底.EXE文件)。程序集是一个要么多只模块/资源文件的逻辑分组(一个模块成为单模块程序集或者单文件程序集;多只模块成为多模块程序集或者基本上文本程序集);程序集是重用、安全性与版本控制的顶小单元。程序集的最主要构成,请圈下的图示:

图片 1

     
程序集并不一定对诺唯一的一个文本,也得蕴涵多个文本,在多单公文组成的次集中,包含程序集清单的公文称为主模块,每个程序集都得包含一个主模块,并且只是发一个。对于程序集更是详细的介绍,在另一样篇博文被持有介绍,在此地就是未以赘述,博文地址:http://www.cnblogs.com/pengze0902/p/6043525.html

一.程序集解析:

   
谈到程序集,就要懂得什么叫做程序集,我们省程序集的概念是呀。程序集大体分为两种植:一种是类库(就是咱们看到底.DLL文件);一种植是可执行程序(就是咱们看看底.EXE文件)。程序集是一个还是多只模块/资源文件的逻辑分组(一个模块成为单模块程序集或者单文件程序集;多只模块成为多模块程序集或者基本上文本程序集);程序集是用、安全性和版本控制的顶小单元。程序集的第一构成,请圈下面的图示:

图片 2

     
程序集并不一定对诺唯一的一个文本,也足以蕴涵多个文本,在多单公文组成的顺序集中,包含程序集清单的公文称为主模块,每个程序集还得包含一个主模块,并且仅来一个。对于程序集更是详实的介绍,在外一样篇博文中装有介绍,在此地虽未以赘述,博文地址:http://www.cnblogs.com/pengze0902/p/6043525.html

二.DotNet的目标代理解析:

二.DotNet的对象代理解析:

   1.目标代理概述:

     
本文主要是上课对象的逾应用程序域访问,前面介绍了应用程序域和程序集的相关消息,在这边就要开上课如何来促成目标的跨越应用程序域的拜会操作。对象超过应用程序域的操作需要了解代理和封送,代理提供了同长途对象完全相同的接口,代理有着和远程对象全等同的接口及称号,对于客户端而言,代理就接近远程对象同。但是代理并无含向客户端程序提供劳动之实际上代码,代理仅仅是拿团结及有平事实上目标绑定,然后以客户端对友好之乞求打包为信息,然后发送给实际目标。

   
 在此首先介绍一下摄,就用理解少单名词“透明代理”和“真实代理”。有如下图所示:

图片 3   
透明代理是出于CLR创建的一律种植专门对象,主要是以用艺术调用转换成为信息交换。由达到图可以见见透明代理和真实代理,透明代理及真代理是逐一对应的涉嫌。透明代理对象最终必须做一个一定的类别的实例。

   
一个主次得到透明代理的援后,这个序将以代理对象上以方式调用。当次于透明代理对象上采取方式调用时,CLR将开创一个新的音讯对象为象征此调用,CLR会将此消息传递给真实代理用于拍卖。

   
真实代理将生另外一修信息,以表示调用的结果,透明代理将应用第二长达消息对是调用的对战进行转发,透明地拿结果传送给调用方。如果真代理返回的响应消息包含异常,透明代理将还抛出这个好,并再度同差将结果传被调用方。

 
 透明代理和诚实代理之间的信交换是由此实际带来的Invoke方法来。在透明代理对象及之方调用,导致从基于堆栈处理的信息变换为基于消息处理的措施。再回到响应消息之前,真实代理的Invoke实现可能用信息分发给另外数之处理节点,为了传送调用到的一个实际目标,最终之拍卖节点归根结底都需将呼吁消息转换为积聚栈帧。 
   

   1.对象代理概述:

     
本文主要是教课对象的逾应用程序域访问,前面介绍了应用程序域和程序集的有关信息,在此间即将起上课如何来实现目标的跨越应用程序域的访问操作。对象超过应用程序域的操作需要懂得代理及封送,代理提供了和长途对象完全相同的接口,代理有着跟远程对象全相同的接口及名,对于客户端而言,代理就类似远程对象同。但是代理并无含向客户端程序提供劳务之莫过于代码,代理仅仅是用好及某平等其实目标绑定,然后将客户端对友好的请求打包为信,然后发送给实际目标。

   
 在此地首先介绍一下摄,就得明白少独名词“透明代理”和“真实代理”。有如下图所示:

图片 4   
透明代理是出于CLR创建的同一种植特别对象,主要是为将计调用转换成为信息交换。由达到图可以看透明代理和真代理,透明代理和诚代理是各个对应之关联。透明代理对象最终要做一个一定的档次的实例。

   
一个顺序取得透明代理的援后,这个顺序用当代理对象及采取方式调用。当次在透明代理对象及应用办法调用时,CLR将创设一个初的信息对象为象征这个调用,CLR会将以此消息传递给真实代理用于拍卖。

   
真实代理将生另外一久信息,以表示调用的结果,透明代理将以第二长条消息对之调用的对战进行中转,透明地用结果传送给调用方。如果实际代理返回的应消息包含异常,透明代理将重新抛出这老,并还同不成将结果传被调用方。

 
 透明代理及诚实代理之间的音信交换是通过实带来的Invoke方法来。在透明代理对象及之不二法门调用,导致从基于堆栈处理的音信变换为根据消息处理的法子。再回去响应消息之前,真实代理的Invoke实现可能以消息分发给其它数据之处理节点,为了传送调用到之一个实际目标,最终的拍卖节点归根结底都用用呼吁消息转换为积聚栈帧。 
   

   2.对象代理原理分析:

        上面根本介绍了代理的局部主导理论,下面看一下这些基本目标。

    (1).RealProxy.GetTransparentProxy():返回 RealProxy
的即实例的晶莹代理。  

  public virtual object GetTransparentProxy()
    {
      return this._tp;
    }

     
 该措施以System.Runtime.Remoting.Proxies命名空间下,RealProxy类:提供摄的基本功能。

    (2).ProxyAttribute.CreateProxy():创建由指定的
ObjRef描述并雄居服务器上之远距离对象的远距离处理代理的实例。 

[SecurityCritical]
    public virtual RealProxy CreateProxy(ObjRef objRef, Type serverType, object serverObject, Context serverContext)
    {
      RemotingProxy remotingProxy = new RemotingProxy(serverType);
      if (serverContext != null)
        RealProxy.SetStubData((RealProxy) remotingProxy, (object) serverContext.InternalContextID);
      if (objRef != null && objRef.GetServerIdentity().IsAllocated)
        remotingProxy.SetSrvInfo(objRef.GetServerIdentity(), objRef.GetDomainID());
      remotingProxy.Initialized = true;
      Type type = serverType;
      if (!type.IsContextful && !type.IsMarshalByRef && serverContext != null)
        throw new RemotingException(Environment.GetResourceString("Remoting_Activation_MBR_ProxyAttribute"));
      return (RealProxy) remotingProxy;
    }

 
 该办法以 System.Runtime.Remoting.Proxies命名空间下,ProxyAttribute类指示对象类型需要打定义代理。该方式接收5单参数,objRef:对而也那创建代理的远距离对象的目标引用;serverType:远程对象所于的服务器的项目;serverObject:服务器对象;serverContext:服务器对象所当的上下文。该措施在指定的
<see cref=”T:System.Runtime.Remoting.ObjRef”/>
中说明的长距离对象的长距离处理代理的新实例。

   
(3).RemotingServices:提供多种使以及宣告远程对象同代理的艺术。此类不克吃接续。

       GetRealProxy()方法返回指定透明代理后面的实际代理。

 [SecurityCritical]
    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
    [MethodImpl(MethodImplOptions.InternalCall)]
    public static extern RealProxy GetRealProxy(object proxy);

   
 该方式接收参数,proxy:一个晶莹剔透代理。该办法返回透明代理后面的真实代理实例。

   
 IsTransparentProxy()方法返回一个布尔值,该值指示给定的靶子是晶莹剔透代理要实际目标。

[SecuritySafeCritical]
    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
    [MethodImpl(MethodImplOptions.InternalCall)]
    public static extern bool IsTransparentProxy(object proxy);

   
该方式接收一个参数,proxy:参数对要检查的靶子的援。该措施返回指定的目标是晶莹代理要实际目标。

   ExecuteMessage():连接至指定的长距离对象,并针对那个实行提供的 <see
cref=”T:System.Runtime.Remoting.Messaging.IMethodCallMessage”/>。

  [SecurityCritical]
    public static IMethodReturnMessage ExecuteMessage(MarshalByRefObject target, IMethodCallMessage reqMsg)
    {
      if (target == null)
        throw new ArgumentNullException("target");
      RealProxy realProxy = RemotingServices.GetRealProxy((object) target);
      if (realProxy is RemotingProxy && !realProxy.DoContextsMatch())
        throw new RemotingException(Environment.GetResourceString("Remoting_Proxy_WrongContext"));
      return (IMethodReturnMessage) new StackBuilderSink(target).SyncProcessMessage((IMessage) reqMsg);
    }

   
该办法接收两单参数,target:要调用其艺术的远距离对象。reqMsg:指定的长距离对象的章程的章程调用消息。该法知识简单地为对象对象创建一个堆放栈生成器,并且发送一个音讯被此接收器。堆栈生成器接收器处理底层的库房操作,并且调用实际的方式。当方法已时,堆栈生成器接收器把作为结果的积栈帧转换为响应的音信,CLR用它当该方式调用的结果返回。

   2.对象代理原理分析:

        上面根本介绍了代理的局部主导理论,下面看一下这些核心目标。

    (1).RealProxy.GetTransparentProxy():返回 RealProxy
的时实例的透明代理。  

  public virtual object GetTransparentProxy()
    {
      return this._tp;
    }

     
 该措施以System.Runtime.Remoting.Proxies命名空间下,RealProxy类:提供摄的基本功能。

    (2).ProxyAttribute.CreateProxy():创建由指定的
ObjRef描述并放在服务器上之长途对象的远距离处理代理的实例。 

[SecurityCritical]
    public virtual RealProxy CreateProxy(ObjRef objRef, Type serverType, object serverObject, Context serverContext)
    {
      RemotingProxy remotingProxy = new RemotingProxy(serverType);
      if (serverContext != null)
        RealProxy.SetStubData((RealProxy) remotingProxy, (object) serverContext.InternalContextID);
      if (objRef != null && objRef.GetServerIdentity().IsAllocated)
        remotingProxy.SetSrvInfo(objRef.GetServerIdentity(), objRef.GetDomainID());
      remotingProxy.Initialized = true;
      Type type = serverType;
      if (!type.IsContextful && !type.IsMarshalByRef && serverContext != null)
        throw new RemotingException(Environment.GetResourceString("Remoting_Activation_MBR_ProxyAttribute"));
      return (RealProxy) remotingProxy;
    }

 
 该办法在 System.Runtime.Remoting.Proxies命名空间下,ProxyAttribute类指示对象类型需要从定义代理。该方式接收5单参数,objRef:对如啊那创建代理的远距离对象的靶子引用;serverType:远程对象所于的服务器的花色;serverObject:服务器对象;serverContext:服务器对象所当的上下文。该措施在指定的
<see cref=”T:System.Runtime.Remoting.ObjRef”/>
中说明的远距离对象的长距离处理代理的新实例。

   
(3).RemotingServices:提供多种运用以及发布远程对象同代理的方。此类不可知给接续。

       GetRealProxy()方法返回指定透明代理后面的实在代理。

 [SecurityCritical]
    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
    [MethodImpl(MethodImplOptions.InternalCall)]
    public static extern RealProxy GetRealProxy(object proxy);

   
 该方式接收参数,proxy:一个晶莹剔透代理。该方法返回透明代理后面的实代理实例。

   
 IsTransparentProxy()方法返回一个布尔值,该值指示给定的对象是透明代理要实际目标。

[SecuritySafeCritical]
    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
    [MethodImpl(MethodImplOptions.InternalCall)]
    public static extern bool IsTransparentProxy(object proxy);

   
该方式接收一个参数,proxy:参数对而检查的对象的援。该措施返回指定的靶子是晶莹剔透代理要实际目标。

   ExecuteMessage():连接至指定的长距离对象,并针对那个实施提供的 <see
cref=”T:System.Runtime.Remoting.Messaging.IMethodCallMessage”/>。

  [SecurityCritical]
    public static IMethodReturnMessage ExecuteMessage(MarshalByRefObject target, IMethodCallMessage reqMsg)
    {
      if (target == null)
        throw new ArgumentNullException("target");
      RealProxy realProxy = RemotingServices.GetRealProxy((object) target);
      if (realProxy is RemotingProxy && !realProxy.DoContextsMatch())
        throw new RemotingException(Environment.GetResourceString("Remoting_Proxy_WrongContext"));
      return (IMethodReturnMessage) new StackBuilderSink(target).SyncProcessMessage((IMessage) reqMsg);
    }

   
该办法接收两单参数,target:要调用其艺术的远距离对象。reqMsg:指定的长距离对象的法子的法子调用消息。该法知识简单地为对象对象创建一个堆放栈生成器,并且发送一个音讯被这个接收器。堆栈生成器接收器处理底层的库房操作,并且调用实际的道。当方法已时,堆栈生成器接收器把作为结果的积栈帧转换为响应的信,CLR用它当作该方式调用的结果返回。

三.DotNet的目标封送解析:

   
 上面介绍了代理,下面简单的介绍一下对象的封送,对象的封送分为两栽,第一种植也传值封送;第二种呢污染引用封送。
  

三.DotNet的靶子封送解析:

   
 上面介绍了代理,下面简单的介绍一下靶的封送,对象的封送分为两种植,第一种也传值封送;第二栽呢污染引用封送。
  

   1.传值封送:

     
当在A应用程序域的目标传递给B应用程序域,.NET将A中目标的状态进行复制、序列化、然后于B中另行创设,并由此代办对象进行访问。

图片 5

图片 6

                     (1 传值封送)                                      
                    (2 传引用封送)

   1.传值封送:

     
当在A应用程序域的靶子传递给B应用程序域,.NET将A中目标的状态进行复制、序列化、然后在B中重新创设,并经过代办对象开展走访。

图片 7

图片 8

                     (1 传值封送)                                      
                    (2 传引用封送)

2.传引用封送:

     
传引用封送的组织要达到图所示,当客户端在代理调用方法时,由代理将对准章程的要发送给长途对象,远程对象实施办法要,最后再用结果传到给客户端,这种艺术叫做传引用封送。传引用封送分为三种不同的计,分为客户端激活(Client
Activated)、服务端激活Singleton(Server Activated
Singleton)、服务端激活SingleCall(Server Activated
SingleCall)。三种方法的齐特性,服务目标创建且一直维持在宿主应用程序中。

   传引用封送的点子于这边就非开详细介绍了。

2.传援封送:

     
传引用封送的构造使齐图所示,当客户端在代理调用方法时,由代理将针对章程的乞求发送给长途对象,远程对象实行方式要,最后再次用结果传到给客户端,这种方法叫做传引用封送。传引用封送分为三种不同之方,分为客户端激活(Client
Activated)、服务端激活Singleton(Server Activated
Singleton)、服务端激活SingleCall(Server Activated
SingleCall)。三种方式的同台特性,服务对象创建且一直维持以宿主应用程序中。

   传引用封送的方法于此处就不做详细介绍了。

四.总结:

    对象的超常应用程序域方法的题材就是介绍这么多,希望对大家享有助。

四.总结:

    对象的跨应用程序域方法的问题虽介绍这么多,希望对大家所有助。

发表评论

电子邮件地址不会被公开。 必填项已用*标注