解析.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)。三种植艺术的一路特点,服务目标创建且直接维系在宿主应用程序中。

   传引用封送的方于此处就无开详细介绍了。

四.总结:

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

四.总结:

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

admin

网站地图xml地图