2010-12-23 4 views
19

Actualmente estoy trabajando en un tema de depuración para mejorar la depuración de la instancia __TransparentProxy resuelta de Unity's TransparentProxyInterceptor.Cómo depurar una instancia de __transparentProxy en VisualStudio 2008?

El escenario de depuración común es que mientras el programa se está rompiendo, quiero ver el valor de miembro público o llamar al método en la instancia envuelta por proxy en la ventana Inspección o la ventana Inmediato en VS2008 IDE.

Aquí viene el problema: Si bien el acceso a la propiedad pública o llamando al método en mi instancia del proxy-envuelta, siempre encontrar el mensaje de excepción que muestra en el/ventana Inmediato Watch, dice

puede no ' obtener campos o llamar a métodos en la instancia de tipo 'MyDomainObject' porque es un proxy para un objeto remoto. '

Yo he cavado en las roscas en la web, y se encontró que la causa de esta excepción se debe al comportamiento de reflexión interna de .NET __transparentProxy. La instancia __transparentProxy no puede acceder a la propiedad/método correspondiente en la instancia RealProxy que se encuentra en la instancia de __transparentProxy.

AFAIK, hay dos maneras (sin ningún diseño o ayuda de herramientas externas) para obtener el valor que quiero. Una de ellas es seguir desplegando y desplegando el valor de miembro privado en la ventana Inspección, y después de varios clics puedo, finalmente, acceder a la instancia original sin proxy, en la que puedo hacer lo que quiera. La otra forma es mucho más rápida, pero aún requiere un poco de esfuerzo cada vez que desea acceder a la instancia original no procesada: RemotingServices.GetRealProxy(myProxiedObject).Target

De cualquier forma es factible pero se requieren algunos esfuerzos para obtener la instancia que quiero, y mientras la instancia proxiada quiero reside en una jerarquía profunda, es terriblemente tedioso seguir desplegándose o escribiendo RemotingServices.GetRealProxy(myProxiedObject).Target (repita esto).

He encontrado dos soluciones, una es intentar obtener ayuda del DebuggerTypeProxyAttribute en .NET, pero parece que no lo hice porque tengo que agregar este atributo a la clase RealProxy -derivada y realmente no lo hago Quiero modificar el código fuente de la clase InterceptingRealProxy en Unity.

La otra forma parece factible pero tuerce un poco mi diseño de clase. Agrego una propiedad protected readonly llamada _rawInstance en la clase base de mi instancia de destino envuelto por proxy, así puedo ver _rawInstance en la ventana de mi reloj que me lleva directamente a mi objeto original sin empaquetar. El código puede tener este aspecto:

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

    (... some members, ignored) 
} 

Me pregunto si hay alguna mejor solución a este problema? Cualquier información o sugerencia sería muy apreciada.

Respuesta

1

Es posible que desee escribir un visualizador para eso. Es un complemento para que Visual Studio "visualice" cualquier valor de visualización y puede hacer lo que quiera hacer ahí, en lugar de hacerlo en su código de proyecto real.

Cuestiones relacionadas