.NET有一个称为远程处理的东西,你可以在不同的应用程序域甚至物理机器之间传递对象。我不完全理解魔法是如何完成的,因此这个问题。
在远程处理中,有两种传递对象的基本方法 - 它们可以被序列化(转换为一堆字节并在另一端重建),或者它们可以从MarshalByRefObject继承,在这种情况下。 NET生成一些透明代理,所有方法调用都转发回原始实例。
这很酷,就像魔法一样。而且我不喜欢编程中的魔法。使用Reflector查看MarshalByRefObject
我没有看到任何会将其与任何其他典型对象区分开来的内容。甚至不是一个奇怪的内部属性或任何东西。那么整个透明代理事件是如何组织起来的呢?我可以自己制作这样的机制吗?我可以制作一个不会从MyMarshalByRefObject
继承的替代MarshalByRefObject
,但仍会采取相同的行动吗?或者MarshalByRefObject
是否接受了.NET引擎本身的特殊处理,整个远程专长是不可复制的?
答案 0 :(得分:18)
魔法似乎是在一个特殊的TransparentProxy
类中 - .NET Runtime以特殊方式处理它。
我认为MarshalByRefObject
可能包含一些可能有助于此机制的其他内部信息,但我对此并未考虑过。
答案 1 :(得分:4)
我相信MarshalByRefObject并不是那么特别。我相信它存在的全部原因在于它的生命周期管理以及它是如何在服务器上进行垃圾收集的。关于LifetimeServices类文档中的内容,有一些很好的评论。
AFAIK,远程处理的真正神奇之处在于您在设置主机时由远程基础设施完成。 MarshalByRefObject没有在AppDomains上进行编组工作的任何实际工作。