我目前正在研究一个调试主题,以改进对 __TransparentProxy
的调试。从 Unity 的 TransparentProxyInterceptor
解析的实例.
常见的调试场景是,当程序中断时,我想在 VS2008 IDE 的 Watch 窗口或 Immediate 窗口中查看公共(public)成员值或调用代理包装实例上的方法。
问题来了:在我的代理包装实例上访问公共(public)属性或调用方法时,我总是遇到显示在 Watch/Immediate 窗口中的异常消息,说
'无法获取'MyDomainObject'类型实例上的字段或调用方法,因为它是远程对象的代理。'
我在网上挖掘了线程,发现这个异常的原因是由于.NET的内部反射行为__transparentProxy
. __transparentProxy
实例无法访问 RealProxy
上的相应属性/方法__transparentProxy
中的底层实例实例本身。
AFAIK,有两种方法(没有任何设计或外部工具的帮助)来获得我想要的值(value)。一是在Watch窗口中不断展开和展开私有(private)成员值,点击几下后,终于可以访问免代理原始实例,在上面可以为所欲为。另一种方式要快得多,但每次您想要访问原始的未代理实例时仍然需要一些努力:RemotingServices.GetRealProxy(myProxiedObject).Target
无论哪种方式都是可行的,但需要付出一些努力才能获得我想要的实例,虽然我想要的代理实例位于较深的层次结构中,但继续展开或编写 RemotingServices.GetRealProxy(myProxiedObject).Target
非常乏味(循环这个)。
我提出了两种解决方案,一种是尝试从 DebuggerTypeProxyAttribute
获得一些帮助。在 .NET 中,但似乎没有这样做,因为我必须将此属性附加到 RealProxy
-派生类,我真的不想修改InterceptingRealProxy
的源代码Unity 中的类。
另一种方法似乎可行,但稍微扭曲了我的类(class)设计。我添加了 protected readonly
名为 _rawInstance
的属性在我的代理包装的目标实例的基类中,因此我可以看到 _rawInstance
在我的监 window 口中,它直接将我引导到我原来的未包装对象。代码可能如下所示:
public class MyDomainBase : MarshalByRefObject
{
protected MyDomainBase _rawInstance
{
get{ return this; }
}
(... some members, ignored)
}
我想知道这个问题是否有更好的解决方案?任何信息或提示将不胜感激。
最佳答案
您可能想为此编写一个可视化工具。它是 Visual Studio 的一个插件,可以“可视化”任何监视值,您可以在其中做任何您想做的事情,而不是在您的实际项目代码中。
关于visual-studio - 如何在 Visual Studio 2008 中调试透明代理实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4517843/