我有一个类型为{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;
}
如何将它们转换为原始对象?如果在相同内存上运行,为什么代理被创建
答案 0 :(得分:2)
您可以通过调用MarshalServices.GetRealProxy()
获取transarent代理的RealProxy
实例,但是获取服务器对象引用会更难,因为默认的RealProxy
只有非公开成员公开这个引用(受保护的方法GetUnwrappedServer()
和内部属性UnwrappedServerObject
)。如果RealProxy
由您自己实施或通过反思(如果您有足够的信任来执行此操作),您可以找到这些。
答案 1 :(得分:0)
您不应该获得对Context绑定对象的实际引用。 Evan你使用反射/内部API得到引用你会得到意想不到的行为(导致你违反规则)。 您可以使用谷歌获得有关上下文对象的更多内容。
我认为您的实际架构/设计存在问题。您不能让对象同时“敏捷”和“上下文绑定”。一个解决方案是将您的大对象拆分为2(一个上下文绑定和另一个敏捷,并在它们之间保存一个引用)。
因此,当您将“敏捷”(继承自MArshallByRefObject)的引用引入创建AppDomain时,您将获得真实对象引用,而不是代理。 (这是MarshallByRefObject定义)