NET对象的跨应用程序域访问

2019-10-08 13:52 来源:未知

    转眼就到了元夕,匆匆忙忙的步伐是大家在为生存努力的勾勒,新的一年,大家理应努力让投机有不平等的生活和追求。生命不息,奋斗不仅仅。在上篇博文中重大介绍了.NET的AppDomain的相关音信,在本篇博文大校会首要表达.NET程序集、对象代理,以及对象的封送原理。

一.程序集解析:

    谈起程序集,将在精通怎么叫做程序集,大家看看程序集的定义是何等。程序集大要分为三种:一种是类库(就是我们看来的.DLL文件);一种是可实行程序(正是大家看看的.EXE文件)。程序集是一个或多个模块/财富文件的逻辑分组(贰个模块成为单模块程序集恐怕单文件程序集;两个模块成为多模块程序集恐怕多文本程序集);程序集是录取、安全性以及版本调节的微小单元。程序集的显要结合,请看上边的图示:

手机客户端 1

      程序集并不一定对应独一的三个文件,也得以分包三个文本,在多个文本组成的程序聚焦,包蕴程序集清单的文本称为主模块,每种程序集都不可能不包涵二个主模块,并且唯有三个。对于程序集更是详实的牵线,在另一篇博文中有着介绍,在此处就不在赘述,博文地址:

二.DotNet的指标代理分析:

   1.对象代理概述:

      本文首假如上课对象的跨应用程序域访谈,前边介绍了运用程序域和次序集的相关音信,在这里将要起先上课如何来兑现目的的跨应用程序域的拜候操作。对象跨应用程序域的操作供给了然代理和封送,代理提供了和长途对象完全同样的接口,代理有着和长距离对象完全平等的接口和称号,对于顾客端来讲,代理就如远程对象同样。可是代理并不包罗向顾客端程序提供劳务的莫过于代码,代理仅仅是将本身与某一实际上目的绑定,然后将顾客端对自个儿的伸手打包为音讯,然后发送给实际目的。

     在这里首先介绍一下代理,就供给理解四个名词“透清朝理”和“真实代理”。有如下图所示:

手机客户端 2    透南陈理是由CLCR-V成立的一种特地对象,主即使为了将艺术调用调换来音讯交流。由上海教室能够看出透西夏理和实际代理,透唐代理和实在代理是逐条对应的涉及。透吴国理对象最后必得当做一个一定的门类的实例。

    三个主次获取透秦代理的援引后,这一个程序将在代理对象上行使方法调用。当程序在透大顺理对象上采用办法调用时,CL奇骏将创建二个新的消息对象以代表那一个调用,CL福特Explorer会将那么些音信传递给真实代理用于拍卖。

    真实代理将时有发生其他一条音信,以象征调用的结果,透西魏理将利用第二条音信对那些调用的对阵举办转载,透明地将结果传送给调用方。假设实际代理再次来到的响应音信富含非常,透北宋理将另行抛出那些可怜,并再度将结果传给调用方。

   透西汉理和实际代理之间的新闻交流是通过真实带来的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:钦命的远程对象的章程的章程调用新闻。该办法知识简单地为目的对象创造一个商旅生成器,并且发送三个消息给这么些接收器。旅社生成器接收器处理底层的货仓操作,何况调用实际的形式。当方法终止时,仓库生成器接收器把作为结果的仓库帧转变为响应的新闻,CLOdyssey用它看做该格局调用的结果回到。

三.DotNet的对象封送深入分析:

     上面介绍了代理,上边轻易的牵线一下对象的封送,对象的封送分为二种,第一种为传值封送;第两种为传引用封送。   

   1.传值封送:

      当位于A应用程序域的对象传递给B应用程序域,.NET将A中目的的情形进行复制、类别化、然后在B中重复创立,并透过代办对象举行访谈。

手机客户端 3

手机客户端 4

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

2.传援用封送:

      传引用封送的构造如上图所示,当客户端在代理调用方法时,由代理将对章程的乞请发送给远程对象,远程对象实践情势央浼,最后再将结果传到给客商端,这种措施叫做传引用封送。传援引封送分为三种差别的艺术,分为客商端激活(Client Activated)、服务端激活Singleton(Server Activated Singleton)、服务端激活SingleCall(Server Activated SingleCall)。两种方法的一只特点,服务对象创制且一贯维系在宿主应用程序中。

   传援用封送的诀要在此地就不做详细介绍了。

四.总结:

    对象的跨应用程序域方法的难点就介绍这么多,希望对大家持有利于。

TAG标签:
版权声明:本文由银河国际点击登录发布于手机客户端,转载请注明出处:NET对象的跨应用程序域访问