Прозрачный прокси для оригинального типа - PullRequest
3 голосов
/ 15 августа 2011

У меня есть объект времени выполнения типа {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 ]

2 голосов
/ 15 августа 2011

Вы можете получить экземпляр RealProxy для прозрачного прокси, вызвав MarshalServices.GetRealProxy(), но получить ссылку на объект сервера будет сложнее, потому что по умолчанию RealProxy только непубличные члены выставляют этоссылка (защищенный метод GetUnwrappedServer() и внутреннее свойство UnwrappedServerObject).Вы можете добраться до них, если RealProxy реализован самостоятельно или с помощью рефлексии (если у вас достаточно доверия для этого).

0 голосов
/ 15 августа 2011

Вы не должны получать фактическую ссылку на объект, связанный с контекстом.Эван, вы получаете ссылку, используя отражение / внутренний API, вы получите непредвиденное поведение (потому что вы нарушаете правила).Вы можете получить больше информации об объекте контекста, используя Google.

Я думаю, у вас есть проблема в вашей фактической архитектуре / дизайне.Вы не можете иметь объект, который будет «гибким» и «связанным с контекстом» одновременно.Решение состоит в том, чтобы разделить ваш большой объект на 2 (один связанный с контекстом, а другой - гибкий, и удерживать ссылку (и) между ними). ​​

Поэтому, когда вы получаете ссылку на "гибкий" объект (который наследуетиз MArshallByRefObject) в создание домена приложения вы получаете реальную ссылку на объект, а не прокси.(это определение MarshallByRefObject)

...