仓促的步履是我们在为生活努力的写照

   
转眼就到了小首春,十万火急的步子是大家在为生存努力的形容,新的一年,大家应有努力让和谐有不平等的生活和追求。生命不息,奋漫不经心不仅仅。在上篇博文中重要介绍了.NET的AppDomain的有关音讯,在本篇博文少将会首要表明.NET程序集、对象代理,以至对象的封送原理。

一.程序集深入分析:

   
说起程序集,将要了解如何叫做程序集,大家看看程序集的概念是如何。程序集大意分为三种:少年老成种是类库(正是大家看来的.DLL文件);后生可畏种是可施行程序(正是大家看看的.EXE文件)。程序集是二个或八个模块/财富文件的逻辑分组(一个模块成为单模块程序集或许单文件程序集;多少个模块成为多模块程序集大概多文本程序集);程序集是录取、安全性以至版本调节的细微单元。程序集的第风姿洒脱结合,请看下边的图示:

图片 1

     
程序集并不一定对应唯风度翩翩的三个文书,也得以分包几个公文,在八个公文组成的程序集中,包蕴程序集项目清单的公文称为主模块,每种程序集都必需带有二个主模块,并且只有一个。对于程序集更是详实的介绍,在另后生可畏篇博文中有所介绍,在那地就不在赘述,博文地址:http://www.cnblogs.com/pengze0902/p/6043525.html

二.DotNet的靶子代理拆解解析:

   1.指标代理概述:

     
本文首即使传授对象的跨应用程序域访问,后面介绍了选取程序域和程序集的有关音信,在那间将在起来上课怎样来促成目的的跨应用程序域的拜会操作。对象跨应用程序域的操作必要理解代理和封送,代理提供了和长距离对象完全相近的接口,代理有着和远程对象完全生龙活虎致的接口和称号,对于客商端来讲,代理就恍如远程对象相似。但是代理并不带有向客商端程序提供劳务的其实代码,代理仅仅是将和睦与某意气风发实在目的绑定,然后将客商端对本人的央求打包为音信,然后发送给实际指标。

   
 在这里间首先介绍一下代理,就要求知道七个名词“透辽朝理”和“真实代理”。好似下图所示:

图片 2   
透明清理是由CLLAND创造的生机勃勃种非常对象,首固然为了将艺术调用调换到音讯沟通。由上海体育场地可以见到透南陈理和实在代理,透南齐理和真正代理是各类对应的关联。透唐朝理对象最后必得当做三个特定的类别的实例。

   
二个顺序得到透明代理的援引后,那么些程序将要代理对象上运用情势调用。当程序在透明代理对象上选择方法调用时,CL福特Explorer将开创三个新的音信对象以象征那个调用,CL奥迪Q5会将以此新闻传递给真实代理用于拍卖。

   
真实代理将生出别的一条新闻,以表示调用的结果,透明朝理将利用第二条新闻对那么些调用的对战进行转账,透明地将结果传送给调用方。要是实际代理再次来到的响应音讯包涵非常,透西夏理将再也抛出这几个那些,并再二回将结果传给调用方。

 
 透元代理和真正代理之间的音信调换是透过实际带来的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).Remoting瑟维斯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:钦定的长途对象的章程的议程调用信息。该措施知识轻便地为对象对象创立一个仓库生成器,并且发送三个消息给那几个选拔器。旅舍生成器选择器管理底层的旅馆操作,况兼调用实际的格局。当方法终止时,仓库生成器接受器把作为结果的货仓帧转变为响应的音讯,CL凯雷德用它看成该情势调用的结果重返。

三.DotNet的目的封送深入分析:

   
 下面介绍了代理,上边轻巧的介绍一下对象的封送,对象的封送分为二种,第生机勃勃种为传值封送;第二种为传引用封送。
  

   1.传值封送:

     
当位于A应用程序域的靶子传递给B应用程序域,.NET将A中指标的场地进行复制、种类化、然后在B中再次创建,并由此代理对象开展探问。

图片 3

图片 4

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

2.传援用封送:

     
传援用封送的组织如上图所示,当客商端在代理调用方法时,由代理将对章程的倡议发送给远程对象,远程对象试行格局哀告,最后再将结果传到给客商端,这种方法叫做传援引封送。传援用封送分为二种区别的艺术,分为客户端激活(Client
Activated)、服务端激活Singleton(Server Activated
Singleton)、服务端激活SingleCall(Server Activated
SingleCall)。两种办法的同台湾特务点,服务对象创制且直接维持在宿主应用程序中。

   传引用封送的秘诀在那就不做详细介绍了。

四.总结:

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

相关文章