原始类型的透明代理
本文关键字:代理 透明 类型 原始 | 更新日期: 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的定义)