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