当我们调用任何超出机器边界的方法(远程方法)时,CLR如何知道这一点,然后序列化(或复制)实际对象而不是内存地址(引用实际对象),以便在跨越机器边界调用任何方法时发送?
这个问题让我想到,在调用方法时总是会发送一个引用,而不是它的副本。
答案 0 :(得分:4)
所有远程互动均基于合同。
正如你所看到的,那里没有魔力。
答案 1 :(得分:1)
在远程处理客户端上的实际对象引用是一个称为“透明代理”的虚假对象,当您在该对象上调用方法时,CLR会检测到它是代理,打包所有参数并调用特殊方法。
然后,这个特殊的方法序列化所有参数,通过线路发送它们,等待回复消息并反序列化返回值。
有关更多详细信息,请参阅RealProxy类的文档(您可以为从MarshelByRefObject继承的任何对象创建代理,后台处理调用的特殊对象继承自RealProxy)
对于Web服务,该过程类似,但不使用特殊的CLR代理,而是使用由Visual Studio创建的代码生成代理。
答案 2 :(得分:0)
如果一个对象继承自MarshalByRefObject,它将被远程调用。如果不是,则序列化并发送。