Как отладить экземпляр __transparentProxy в VisualStudio 2008? - PullRequest
19 голосов
/ 23 декабря 2010

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

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

1 Ответ

1 голос
/ 10 июня 2012

Возможно, вы захотите написать визуализатор для этого. Это плагин для Visual Studio, позволяющий «визуализировать» любое значение часов, и вы можете делать там все, что захотите, а не в своем реальном коде проекта.

...