4

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

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

4

2 回答 2

2

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

于 2011-08-14T22:53:57.543 回答
0

您不应该获得对 Context 绑定对象的实际引用。Evan,您使用反射/内部 API 获得参考,您将获得意外行为(因为您违反了规则)。您可以使用 google 获得有关上下文对象的更多信息。

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

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

于 2011-08-15T11:40:06.023 回答