Как отладить экземпляр __transparentProxy в VisualStudio 2008?

Я сейчас работаю над темой отладки, чтобы улучшить отладку экземпляра __ 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)
}

Интересно, есть ли лучшее решение этой проблемы? Будем очень признательны за любую информацию или советы.

19
задан Talonj 24 February 2015 в 21:58
поделиться