CLR如何知道复制参数(精确对象)?

时间:2009-02-25 10:17:43

标签: .net clr

当我们调用任何超出机器边界的方法远程方法时,CLR如何知道这一点,然后序列化或复制实际对象而不是内存地址引用实际对象,以便在跨越机器边界调用任何方法时发送?

这个问题让我想到,在调用方法时总是会发送一个引用,而不是它的副本。


好吧,我正在谈论任何类型的远程呼叫,无论是远程还是Web服务。我的意思是,客户端必须调用一个方法并发送参数,现在如果它是本地的,它将只发送对象的内存地址来使用它们,否则它将以XML或类似方式进行复制或序列化。那么,它怎么知道该做什么?

3 个答案:

答案 0 :(得分:4)

所有远程互动均基于合同。

  • 如果是原始套接字,则为应用程序级协议。 (我将省略这一个。)
  • 在远程处理的情况下,它主要是基于接口的合同。客户端知道它正在与之交谈的服务器的方法和属性。数据通过线路(或跨越appdomain边界)以序列化形式(xml或二进制)发送。正如乔纳森所指出的那样,这条规则有一个例外: MarshalByRefObject 。它的继承者不是序列化的,而是通过“引用”(编组,“代理编辑”)来传递。
  • 对于Web服务(主要是WCF),它是基于 WSDL 的合同。客户端知道XML模式 - 服务器理解的语言。数据在SOAP中序列化,并通过网络发送。

正如你所看到的,那里没有魔力。

答案 1 :(得分:1)

在远程处理客户端上的实际对象引用是一个称为“透明代理”的虚假对象,当您在该对象上调用方法时,CLR会检测到它是代理,打包所有参数并调用特殊方法。

然后,这个特殊的方法序列化所有参数,通过线路发送它们,等待回复消息并反序列化返回值。

有关更多详细信息,请参阅RealProxy类的文档(您可以为从MarshelByRefObject继承的任何对象创建代理,后台处理调用的特殊对象继承自RealProxy)

对于Web服务,该过程类似,但不使用特殊的CLR代理,而是使用由Visual Studio创建的代码生成代理。

答案 2 :(得分:0)

如果一个对象继承自MarshalByRefObject,它将被远程调用。如果不是,则序列化并发送。