透明代理到原始类型

时间:2011-08-14 21:44:55

标签: c# marshalbyrefobject context-bound

我有一个类型为{System.Runtime.Remoting.Proxies .__ TransparentProxy}的运行时对象,它是从继承自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;
        }

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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

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