.NET有一种叫做远程处理的东西,你可以在不同的应用域甚至是物理机器之间传递对象。我不完全理解魔法是如何实现的,因此我提出了这个问题。
在远程处理中,有两种传递对象的基本方法--它们可以被序列化(转换为一堆字节并在另一端重新构建),或者它们可以从MarshalByRefObject继承,在这种情况下,.NET会建立一些透明的代理,所有的方法调用都会被转发回原始实例。
这很酷,像魔术一样工作。我不喜欢编程中的魔法。使用反射器查看MarshalByRefObject时,我看不到任何可以将其与其他典型对象区分开来的东西。甚至没有奇怪的内部属性或任何东西。那么整个透明代理是如何组织起来的呢?我能自己做一个这样的机制吗?我是否可以创建一个不继承MarshalByRefObject,但行为仍然相同的备用MyMarshalByRefObject?或者,MarshalByRefObject正在接受.NET引擎本身的一些特殊处理,并且整个远程处理的壮举对于凡人来说是不可复制的?
发布于 2010-06-02 19:32:29
神奇之处似乎在于一个特殊的TransparentProxy类-- .NET运行时以一种特殊的方式处理它。
如果你想使用它,请参阅an article about RealProxy
我认为MarshalByRefObject可能包含一些额外的内部信息,这些信息可能对此机制有帮助,但我并没有深入研究。
发布于 2010-04-27 19:46:59
我相信MarshalByRefObject并没有那么特别。我相信它存在的全部原因在于它的生命周期管理和如何在服务器上对其进行垃圾回收。在LifetimeServices类文档中有一些很好的注释。
AFAIK,远程处理的真正魔力是在您设置主机时由远程处理基础结构自己完成的。MarshalByRefObject并没有在AppDomains中做任何真正的编组工作。
https://stackoverflow.com/questions/2720703
复制相似问题