在上篇博文中重点介绍了.NET的AppDomain的相关信息,匆匆忙忙的脚步是我们在为生存努力的刻画

   
转眼就到了重阳,匆匆忙忙的步伐是咱们在为生存努力的描绘,新的一年,我们应有大力让投机有不一致的生活和追求。生命不息,奋斗不止。在上篇博文中重要介绍了.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).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用它当做该措施调用的结果回到。

   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).Remoting瑟维斯(Service)(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用它看作该办法调用的结果回到。

三.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)。两种办法的联名特性,服务目的创设且直接保持在宿主应用程序中。

   传引用封送的不二法门在此间就不做详细介绍了。

四.总结:

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

四.总结:

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

相关文章