Я сейчас работаю над темой отладки, чтобы улучшить отладку экземпляра __ TransparentProxy
, разрешенного из Unity TransparentProxyInterceptor
.
Обычный сценарий отладки заключается в том, что когда программа ломается, Я хочу увидеть значение общедоступного члена или вызвать метод в экземпляре с прокси-оболочкой в окне просмотра или в окне немедленного доступа в IDE VS2008.
Здесь возникает проблема: При доступе к общедоступному свойству или вызову метода в моем обернутый в прокси экземпляр, я всегда сталкиваюсь с сообщением об исключении, которое отображается в окне Watch / Immediate,
«Невозможно получить поля или вызвать методы для экземпляра типа MyDomainObject, потому что это прокси для удаленного объекта».
Я покопался в потоках в Интернете и обнаружил, что причиной этого исключения является поведение внутреннего отражения .NET __ transparentProxy
. Экземпляр __ transparentProxy
может ' t получить доступ к соответствующему свойству / методу в экземпляре RealProxy
, лежащем в основе самого экземпляра __ transparentProxy
.
AFAIK, есть два способа (без какой-либо разработки или помощи со стороны внешних инструментов) чтобы получить желаемое. Один из них - это продолжать разворачивать и разворачивать значение частного члена в окне Watch, и после нескольких щелчков мыши я наконец могу получить доступ к исходному экземпляру без прокси, с которым я могу делать все, что хочу. Другой способ намного быстрее, но все же требует небольших усилий каждый раз, когда вы хотите получить доступ к исходному экземпляру без проксирования: RemotingServices.GetRealProxy (myProxiedObject) .Target
Любой способ работает, но требует некоторых усилий для получения экземпляра I. хочу, и хотя проксируемый экземпляр, который я хочу, находится в глубокой иерархии, он ужасно утомительно продолжать разворачивать или писать RemotingServices.GetRealProxy (myProxiedObject) .Target
(зациклить).
Я придумал два решения, первое - попытаться получить помощь от DebuggerTypeProxyAttribute
в .NET, но, похоже, не смог этого сделать, потому что мне нужно добавить этот атрибут к классу, производному от RealProxy
, и я действительно не хочу изменять исходный код InterceptingRealProxy
класс в Unity.
Другой способ кажется возможным, но немного изменит мой дизайн класса. Я добавляю свойство , защищенное только для чтения
, с именем _rawInstance
в моем базовом классе целевого экземпляра с прокси-оболочкой, поэтому я могу видеть _rawInstance
в моем окне просмотра, что приводит меня непосредственно к мой оригинальный неупакованный объект. Код может выглядеть так:
public class MyDomainBase : MarshalByRefObject
{
protected MyDomainBase _rawInstance
{
get{ return this; }
}
(... some members, ignored)
}
Интересно, есть ли лучшее решение этой проблемы? Будем очень признательны за любую информацию или советы.