Подтвердить что ты не робот

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

В настоящее время я работаю над темой отладки, чтобы улучшить отладку до экземпляра __TransparentProxy, разрешенного из Unity TransparentProxyInterceptor.

Общий сценарий отладки заключается в том, что во время разрыва программы я хочу увидеть значение публичного участника или вызвать метод в экземпляре с оболочкой через прокси-сервер в окне просмотра или в окне Immediate в VS2008 IDE.

Приходит проблема: При доступе к общедоступному свойству или методу вызова в моем экземпляре с прокси-сервером я всегда сталкиваюсь с сообщением об исключении, которое отображается в окне Watch/Immediate, говорит

Невозможно получить поля или методы вызова в экземпляре типа "MyDomainObject", поскольку это прокси-сервер для удаленного объекта.

Я впился в потоки в Интернете и обнаружил, что причина этого исключения обусловлена ​​внутренним отражением .NET __TransparentProxy. Экземпляр __TransparentProxy не может получить доступ к соответствующему свойству/методу в экземпляре RealProxy, лежащем в самом экземпляре __TransparentProxy.

AFAIK, есть два способа (без какой-либо разработки или помощи от внешних инструментов), чтобы получить значение, которое я хочу. Один из них продолжает разворачивать и разворачивать значение частного участника в окне просмотра, и после нескольких щелчков я могу, наконец, получить доступ к оригинальному экземпляру без посредников, на котором я могу делать все, что захочу. Другой способ намного быстрее, но при этом требуется небольшое усилие каждый раз, когда вы хотите получить доступ к исходному непроявленному экземпляру: RemotingServices.GetRealProxy(myProxiedObject).Target

В любом случае это выполнимо, но предпринимает определенные усилия, чтобы получить экземпляр, который я хочу, и, хотя прокси-экземпляр, который я хочу, находится в глубокой иерархии, очень утомительно продолжать разворачивать или писать RemotingServices.GetRealProxy(myProxiedObject).Target (цикл this).

Я придумал два решения: один пытается получить некоторую помощь от DebuggerTypeProxyAttribute в .NET, но, похоже, этого не сделать, потому что я должен добавить этот атрибут в класс RealProxy -derived, а я действительно не хотят изменять исходный код класса InterceptingRealProxy в Unity.

Другой способ кажется выполнимым, но немного крутите мой класс. Я добавляю свойство protected readonly, называемое _rawInstance в моем базовом классе целевого экземпляра с прокси-оболочкой, поэтому я вижу _rawInstance в окне моих часов, что приводит меня непосредственно к моему первоначальному развернутому объекту. Код может выглядеть так:

public class MyDomainBase : MarshalByRefObject
{
    protected MyDomainBase _rawInstance
    {
        get{ return this; }
    }

    (... some members, ignored)
}

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

4b9b3361

Ответ 1

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