`

对MarshalByRefObject的解释

阅读更多
    今天看到一段介绍C#实现代理模式的代码,使用到了MarshalByRefObject。那么MarshalByRefObject到底是什么东西呢?简单来讲,继承此类的对象可以跨越应用程序域边界被引用,甚至被远程引用。远程调用时,将产生一个远程对象在本地的透明代理,通过此代理来进行远程调用。一篇很好的解释文章,来自http://dudu.cnblogs.com/archive/2004/03/04/2182.html


问:<o:p>

打扰一下,请问MarshalByRefObject中的"Marshal"应该怎样理解?<o:p>

<o:p> </o:p>

回复

按照package的意思理解——当一个对象需要长途跋涉到另一个环境中时,需要将其marshal成一个可以传输的形态(比如在.NET Remoting中对象将被打包成一个serializableObjRef实例——这个ByRef就是指ObjRef这种形态);同理,当打包以后传输到目标地点,还要执行unmarshal的操作将其还原为内存中的对象。:)<o:p>

<o:p> </o:p>

问:<o:p>

谢谢!<o:p>

MarshalByRefObject是不是可以这样理解:对被引用的对象进行Marshal。如果按照package的意思理解,那package的过程是怎样的?<o:p>

 <o:p>

MSDN上这样讲:<o:p>

MarshalByRefObject是通过使用代理交换消息来跨应用程序域边界进行通讯的对象的基类.<o:p>

MarshalByRefObject对象在本地应用程序域的边界内可直接访问。远程应用程序域中的应用程序首次访问MarshalByRefObject时,会向该远程应用程序传递代理。对该代理后面的调用将封送回驻留在本地应用程序域中的对象。<o:p>

 <o:p>

Marshal中,上面所说的代理是什么?有什么用?<o:p>

 <o:p>

MSDN上还讲到:<o:p>

当跨应用程序域边界使用类型时,类型必须是从MarshalByRefObject继承的,而且由于对象的成员在创建它们的应用程序域之外无法使用,所以不得复制对象的状态<o:p>

 <o:p>

既然对象的状态不能传递过去,那传递这个对象又有何意义?<o:p>

第一次去理解MarshalByRefObject,有的问题可能提的比较肤浅,请您指点。<o:p>

<o:p> </o:p>

回复:<o:p>

MarshalByRefObject是所有可以在AppDomain边界外部访问的对象的基类,重心不是marshal,而是object,即object that could be marshaled by reference,也就是可以通过Ref(实际上是ObjRef对象)的机制进行封送MSDN中文版对marshal一词的翻译)的对象。封送的行为是由代理来做的,这里说的代理就是我文章中讲过的.NET Remoting的真实代理(即RemotingProxy)。真实代理不是有一个Invoke()方法吗?当你透过对一个MBRO的透明代理访问该对象的方法时,透明代理将把基于堆栈的方法调用转换为方法调用消息(IMethodCallMessage)并转发给真实代理(在Remoting的场合中也即RemotingProxy),而RemotingProxy的任务就是把对象封送并连同方法调用消息一起转发给远程应用程序域;到达目的地以后的操作类似:远程应用程序域中的监听方当收到发来的方法调用消息时,先取出封送好的ObjRef(这个对象里面保存着发来调用的那个对象!),将其结封(unmarshal)为本地的对象,并获得其透明代理,然后就可以把方法调用消息在转换回基于堆栈的调用发送给这个对象。<o:p>

 <o:p>

对象是在本地维护的,但是方法可以在远程调用。你比如说一个web应用程序,你是通过本地的浏览器远程访问这个应用程序,但是应用程序的状态不会由你的浏览器负责(所以你只是在访问这个应用程序提供给你的功能而已,你并没于拥有应用程序本身,包括其所有数据),你只是发送一个个的请求,服务器告诉你处理的结果。在Remoting中 也是一样,当你获得一个远程对象的时候,你实际上只拥有对这个对象的一个远程引用,虽然你可以调用它的方法,但实际上这些操作都是发生在远程的(就是前面 讲过的过程),你只是传入了一些参数,得到了一个结果,但对象的状态还是在远程维护的(换句话说,对象本身也就是对象的所有状态并没有被往返传递,传递的 只是传入传出的参数——当然,如果参数是一个MBRO的话,还是传递对象被封送的引用)。 <o:p>

也许应该给你准备一个好理解的例子……你就会豁然开朗了。:)<o:p>

<o:p> </o:p>

问:<o:p>

我这样的理解对不对?<o:p>

一般的对象与从MarshalByRefObject继承的对象区别是:<o:p>

一般的对象只能在本地应用程序域之内被引用,而MarshalByRefObject对象可以跨越应用程序域边界被引用,甚至被远程引用。<o:p>

<o:p> </o:p>

回复

Exactly! 当对象跨出AppDomain边界的时候,实际上只是它的一个引用(ObjRef)。你比如说吧:<o:p>

 <o:p>

public class LocalObject
{
<o:p>

  public void CallRemoteObject(MarshalByRefObject mbro)
  {
    Console.WriteLine(mbro.ToString());
<o:p>

  }
}
<o:p>

 <o:p>

当传入一个在本地创建的mbro对象时,ToString()方法是直接发送给对象的;而当mbro是通过Remoting创建的远程对象的话,实际上它只是一个包含有已经marshal好的ObjRef的透明代理,ObjRef里面有什么?对象实例的URI!所以当你调用这个远程对象时,相当于向这个远程端口(tcp://remoteServer/xxxx.rem)发送方法调用消息而已。只不过透明代理隐藏了对象位置的概念,而RemotingProxy真实代理则是实际上处理远程方法调用和对象封送的中枢对象。



dennis 2007-03-28 17:55 发表评论
分享到:
评论

相关推荐

    VB.NET Remoting实例

    这个过程对客户端来说是透明的,就像调用本地对象一样。 在VB.NET中,你可以使用`.NET Remoting`的相关类来实现这些步骤,例如`System.MarshalByRefObject`、`System.Runtime.Remoting.Services.RemotingServices`...

    为VB.NET解释的.NET远程处理事件

    VB.NET(Visual Basic .NET)是.NET框架支持的编程语言之一,因此理解如何在VB.NET中处理.NET远程事件对开发分布式系统至关重要。 首先,我们要知道.NET远程处理的核心组件是`System.Runtime.Remoting`命名空间。这...

    Remoting 实例

    本实例将详细解释如何利用Remoting调用接口来实现基本的数学运算,并展示如何通过一个接口调用另一个接口,以此简化web.config的配置。 首先,Remoting的核心概念是透明的远程对象调用,它提供了对远程对象的直接...

    .Net Remoting简单范例代码

    在这个案例中,它可能解释了服务器和客户端应用程序的启动步骤以及预期的行为。 `ServerTestRemotingConsole`是服务器端的应用程序。在.NET Remoting中,服务器是暴露可以被远程访问的对象的一方。这个程序会创建一...

    C#动态加载DLL主要说明如何通过反射实现动态加载DLL

    在.NET框架中,C#程序员...通过以上解释,我们可以理解如何利用反射在C#中动态加载和执行DLL文件,以及在使用过程中需要注意的关键点。动态加载DLL是.NET开发中的一个重要技巧,它使得我们的应用程序更加灵活和可扩展。

    c# hostting

    接下来,我们将对提供的部分代码进行详细解析: ```csharp using System; using System.IO; using System.Web; using System.Web.Hosting; public class MyExeHost : MarshalByRefObject { public void ...

    C#串口编程Serialport类1.doc

    16. NewLine:获取或设置用于解释ReadLine和WriteLine方法调用结束的值。 17. Parity:获取或设置奇偶校验检查协议。 18. ParityReplace:获取或设置一个字节,该字节在发生奇偶校验错误时替换数据流中的无效字节。 ...

    CommonCodes C# 类库(串口通讯,.Net Remoting FtpCS)

    以下是这些关键知识点的详细解释:** ### 1. 串口通讯(Serial Communication) 串口通讯是计算机通过串行端口与其他设备进行数据传输的一种方式。在C#中,`System.IO.Ports`命名空间提供了`SerialPort`类来处理...

    .net Remoting示例

    以下是对.NET Remoting示例的详细解释和相关知识点。 **一、.NET Remoting基础** .NET Remoting的核心概念是远程对象和通道。远程对象是可以从远程进程中调用的方法的对象,而通道则是负责在网络中传输消息的中介...

    CLR via C# 3rd Edition

    增加了对checked和unchecked代码、BigInterger类型以及C# 4.0 dynamic类型的讨论。 Chapter 6-Type and Member Basics 无新话题。 Chapter 7-Constants and Fields 无新话题。 Chapter 8-Methods 新增了扩展...

    TemotingTest-MBV 主要实现 .net remtoing 下 使用MBV的远程调用.zip

    由于没有具体的源代码,我们无法详细解释每一部分,但这个项目的核心思想是利用.NET Remoting的跨进程通信能力,结合MBV模式,创建一个可以在不同进程中运行的、可以远程操作的数据绑定模型。 标签"mvc"表明此项目...

    NET REMOTING 技术 -4

    下面以具体的代码示例来进一步解释服务端对象和客户端对象的设计。 ##### 4.1 服务端对象设计 服务端对象 `Server` 继承自 `MarshalByRefObject`,并包含以下成员: - 一个委托类型 `NumberChangedEventHandler`...

    在远程计算机上推送并运行.NET代码

    1. 创建可远程调用的对象:这些对象需要标记为可序列化,并继承自`MarshalByRefObject`,这样它们可以跨越进程边界。 2. 在服务器端注册远程对象:这通常在服务器的应用程序域(AppDomain)中完成,使对象可以在远程...

Global site tag (gtag.js) - Google Analytics