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