MarshalByRefObject是否特别?

.NET有一个叫远程的东西,你可以在不同的AppDomain或者物理机器之间传递对象。 我不完全理解这个魔法是如何完成的,因此这个问题。

在远程处理中,有两种传递对象的基本方法 – 可以将它们序列化(转换为一堆字节并在另一端重新构build),也可以从MarshalByRefObjectinheritance,在这种情况下,.NET会生成一些透明的代理和所有方法调用被转发回原来的实例。

这很酷,像魔术一样工作。 而且我不喜欢编程中的魔法。 使用Reflector查看MarshalByRefObject我没有看到任何可以将它与其他任何典型对象区分开来的东西。 甚至不是一个奇怪的内部属性或任何东西。 那么整个透明代理事物是如何组织的呢? 我能自己制造这样一个机制吗? 我可以做一个替代的MyMarshalByRefObject不会从MarshalByRefObjectinheritance,但仍然会一样吗? 还是MarshalByRefObject接受了.NET引擎本身的一些特殊处理,整个远程的壮举是不可复制的,只有凡人?

神奇似乎是在一个特殊的TransparentProxy类 – 的.NET运行时处理它在一个特殊的方式。

  • 如果您想使用它,请参阅关于RealProxy的文章 [现在链接看起来破碎了:-( 2011-10-14]
  • 如果您想了解更多关于“魔术”的内容,请参阅TransparentProxy实现的文章 。
  • 有关基本概述,请尝试MSDN文章“远程处理:技术概述” 。

我认为MarshalByRefObject可能包含一些额外的内部信息,可以帮助这个机制,但我没有看太多。

我相信MarshalByRefObject并不是那么特别。 我相信它存在的全部理由在于它的生命周期pipe理以及如何在服务器上进行垃圾收集。 对LifetimeServices类文档中的内容有一些很好的评论。

AFAIK,当您设置主机时,远程处理的真正魔力是由远程处理基础架构完成的。 MarshalByRefObject并没有在AppDomain中做任何编组东西的实际工作。