Прозрачный прокси для оригинального типа
У меня есть объект времени выполнения типа {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 ответа
Вы можете получить RealProxy
экземпляр для прозрачного прокси путем вызова MarshalServices.GetRealProxy()
, но получить ссылку на объект сервера сложнее, потому что по умолчанию RealProxy
только непубличные участники, выставляющие эту ссылку (защищенный метод GetUnwrappedServer()
и внутренняя собственность UnwrappedServerObject
). Вы можете добраться до тех, кто RealProxy
реализуется самостоятельно или с помощью рефлексии (если у вас достаточно доверия для этого).
Вы не должны получать фактическую ссылку на объект, связанный с контекстом. Эван, вы получаете ссылку, используя отражение / внутренний API, вы получите непредвиденное поведение (потому что вы нарушаете правила). Вы можете получить больше информации об объекте контекста, используя Google.
Я думаю, что у вас есть проблема в вашей реальной архитектуре / дизайне. Вы не можете иметь объект, который будет "гибким" и "связанным с контекстом" одновременно. Решение состоит в том, чтобы разделить ваш большой объект на 2 (один контекстный, другой - гибкий) и хранить между ними ссылку (и).
Поэтому, когда вы получаете ссылку "гибкого" (которая наследуется от MArshallByRefObject) в создание AppDomain, вы получаете реальную ссылку на объект, а не прокси. (это определение MarshallByRefObject)