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

三.DotNet的靶子封送解析:

   
 上边介绍了代办,下面简单的牵线一下目的的封送,对象的封送分为三种,第一种为传值封送;第两种为传引用封送。
  

四.总结:

    对象的跨应用程序域方法的问题就介绍这么多,希望对我们持有匡助。

   1.对象代理概述:

     
本文首假诺教课对象的跨应用程序域访问,后边介绍了使用程序域和程序集的相干信息,在那边即将起头上课如何来贯彻目的的跨应用程序域的造访操作。对象跨应用程序域的操作需要了解代理和封送,代理提供了和长距离对象完全相同的接口,代理有着和长距离对象完全一样的接口和名称,对于客户端而言,代理就仿佛远程对象一样。不过代理并不包含向客户端程序提供劳动的实际上代码,代理仅仅是将协调与某一其实目的绑定,然后将客户端对自己的乞求打包为消息,然后发送给实际目的。

   
 在这里首先介绍一下代理,就需要了然六个名词“透大顺理”和“真实代理”。有如下图所示:

美学原理 1   
透金朝理是由CLR成立的一种专门对象,紧假若为了将艺术调用转换成信息交换。由上图可以看到透北宋理和真正代理,透西楚理和真正代理是逐一对应的关系。透晋朝理对象最终必须充当一个一定的品种的实例。

   
一个程序取得透北周理的引用后,这多少个顺序将在代理对象上行使办法调用。当程序在透孙吴理对象上使用格局调用时,CLR将创造一个新的信息对象以表示这一个调用,CLR会将以此消息传递给真实代理用于拍卖。

   
真实代理将发出此外一条音讯,以象征调用的结果,透明朝理将应用第二条音讯对那么些调用的对阵进行转发,透明地将结果传送给调用方。假设实际代理再次回到的响应信息包含非凡,透汉朝理将重新抛出那一个充裕,并再一遍将结果传给调用方。

 
 透古代理和忠实代理之间的信息交流是因而真正带来的Invoke方法暴发。在透南陈理对象上的不二法门调用,导致从基于堆栈处理的音信转换为按照音信处理的方法。再回去响应消息从前,真实代理的Invoke实现可能将音信分发给其他数据的拍卖节点,为了传送调用到的一个实在目的,最后的拍卖节点归根结蒂都急需将请求音信转换为堆栈帧。 
   

二.DotNet的靶子代了然析:

2.传引用封送:

     
传引用封送的结构如上图所示,当客户端在代理调用方法时,由代理将对艺术的呼吁发送给远程对象,远程对象实施形式请求,最终再将结果传到给客户端,这种办法叫做传引用封送。传引用封送分为两种不同的艺术,分为客户端激活(Client
Activated)、服务端激活Singleton(Server Activated
Singleton)、服务端激活SingleCall(Server Activated
SingleCall)。两种形式的一起特点,服务对象创设且间接维系在宿主应用程序中。

   传引用封送的点子在此间就不做详细介绍了。

   
转眼就到了除夕,匆匆忙忙的步履是大家在为活着努力的写照,新的一年,大家应当奋力让自己有不均等的生存和追求。生命不息,奋斗不止。在上篇博文中要害介绍了.NET的AppDomain的连带信息,在本篇博文校官会紧要表达.NET程序集、对象代理,以及对象的封送原理。

一.程序集解析:

   
谈到程序集,就要领会哪些叫做程序集,我们看看程序集的定义是如何。程序集大体分成二种:一种是类库(就是大家看到的.DLL文件);一种是可执行程序(就是我们看看的.EXE文件)。程序集是一个或两个模块/资源文件的逻辑分组(一个模块成为单模块程序集或者单文件程序集;五个模块成为多模块程序集或者多文件程序集);程序集是录取、安全性以及版本控制的细小单元。程序集的基本点结合,请看下边的图示:

美学原理 2

     
程序集并不一定对应唯一的一个文本,也足以涵盖多少个公文,在六个文件组成的次序集中,包含程序集清单的文书称为主模块,每个程序集都必须含有一个主模块,并且唯有一个。对于程序集更是详实的牵线,在另一篇博文中存有介绍,在此处就不在赘述,博文地址:http://www.cnblogs.com/pengze0902/p/6043525.html

   1.传值封送:

     
当位于A应用程序域的目标传递给B应用程序域,.NET将A中目的的情况举行复制、连串化、然后在B中重新创设,并经过代理对象开展走访。

美学原理 3

美学原理 4

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

   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).RemotingService(Service)s:提供多种行使和发表远程对象及代理的主意。此类不可能被延续。

美学原理,       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用它看作该方法调用的结果重临。