透明代理到原始类型

我有一个类型为{System.Runtime.Remoting.Proxies .__ TransparentProxy}的运行时对象,它是从inheritance自ContextBoundObject的类实例创建的。 这个类将事件引发到其他一些对象,我需要将此代理对象转换为原始对象。 所有对象都在单个系统上的默认AppDomain中。

public abstract class ObjectBase : ContextBoundObject, IObjectBase { } public IMessageSink GetObjectSink(MarshalByRefObject o, IMessageSink next) { _context = (ObjectBase)o;// as ObjectBase; does not give any error but type remains /// transparent proxy in VS watch window. // no property to get the underlying type of the proxy return _aspect; } 

如何将它们转换为原始对象? 如果在相同内存上运行,为什么代理被创建

您可以通过调用MarshalServices.GetRealProxy()来获取transarent代理的RealProxy实例,但是获取服务器对象引用会更难,因为默认的RealProxy只有非公共成员公开此引用(受保护的方法GetUnwrappedServer()和内部属性UnwrappedServerObject )。 如果RealProxy由您自己实现或通过reflection实现(如果您有足够的信任来执行此操作),您可以获得这些。

您不应该获得对Context绑定对象的实际引用。 Evan你使用reflection/内部API获得引用,你会得到意想不到的行为(导致你违反规则)。 您可以使用谷歌获取有关上下文对象的更多内容。

我认为你的实际架构/设计存在问题。 您不能让对象同时“敏捷”和“上下文绑定”。 解决方案是将您的大对象拆分为2(一个上下文绑定和另一个敏捷,并在它们之间保存一个引用)。

因此,当您将“敏捷”(inheritance自MArshallByRefObject)的引用引入创建AppDomain时,您将获得真实的对象引用,而不是代理。 (这是MarshallByRefObject定义)