原始类型的透明代理

本文关键字:代理 透明 类型 原始 | 更新日期: 2023-09-27 18:05:28

我有一个类型为{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;
        }

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

原始类型的透明代理

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

您不应该获得对上下文绑定对象的实际引用。即使你使用反射/内部API获得引用,你也会得到意想不到的行为(因为你违反了规则)。你可以使用google获取更多关于上下文对象的信息。

我认为你的实际建筑/设计有问题。你不能同时让一个对象既"敏捷"又"受上下文约束"。一个解决方案是将你的大对象分成两个(一个上下文绑定,另一个敏捷,并在它们之间保留一个引用)。

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