代码之家  ›  专栏  ›  技术社区  ›  Kunal S

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

  •  1
  • Kunal S  · 技术社区  · 15 年前

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

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


    嗯,我说的是任何一种远程调用,不管是远程调用还是Web服务。我的意思是,客户机必须调用一个方法并发送参数,如果它是本地的,它将只发送对象的内存地址来使用它们,否则它将以XML或类似的方式进行复制或序列化。那么,它怎么知道该怎么做呢?

    3 回复  |  直到 15 年前
        1
  •  4
  •   DreamSonic    15 年前

    所有远程交互都基于契约。

    • 对于原始套接字,它是一个应用程序级协议。(我将省略这个。)
    • 在远程处理的情况下,它主要是基于接口的契约。客户机知道它所说的服务器的方法和属性。数据以序列化形式(XML或二进制)通过线路(或仅跨AppDomain边界)发送。正如乔纳森所指出的,这条规则有一个例外: MarshalByRefObject . 它的继承者不是序列化的,而是通过“引用”(封送,“代理”)传递的。
    • 在Web服务(主要是WCF)的情况下, WSDL -基于合同。客户机知道XML模式——服务器可以理解的语言。数据在SOAP中序列化,并通过导线发送。

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

        2
  •  1
  •   Nir    15 年前

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

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

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

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

        3
  •  0
  •   Jonathan C Dickinson    15 年前

    如果对象继承自MarshalByRefObject,则将远程调用该对象。如果没有,它将被序列化并发送。