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