如何在VisualStudio 2008中调试__transparentProxy实例?

Liu*_*ate 19 debugging proxy remoting visual-studio

我正在研究一个调试主题,以改进__TransparentProxy从Unity解析实例的调试TransparentProxyInterceptor.

常见的调试方案是,当程序中断时,我希望在监视窗口或VS2008 IDE中的立即窗口中查看公共成员值或在代理程序包装的实例上调用该方法.

问题出现了:在我的代理包装实例上访问公共属性或调用方法时,我总是遇到Watch/Immediate窗口中显示的异常消息,

'无法在类型'MyDomainObject'的实例上获取字段或调用方法,因为它是远程对象的代理.

我已经挖掘了Web上的线程,并发现此异常的原因是由于.NET的内部反射行为__transparentProxy.的__transparentProxy实例不能在访问相应的属性/方法RealProxy例如在底层__transparentProxy实例本身.

AFAIK,有两种方式(没有外部工具的任何设计或帮助)来获得我想要的价值.一个是在Watch窗口中继续展开和展开私有成员值,经过几次点击后,我终于可以访问无需代理的原始实例,我可以在其上做任何我想做的事情.另一种方法更快,但每次要访问原始的未经处理的实例时仍需要花费一些精力:RemotingServices.GetRealProxy(myProxiedObject).Target

无论哪种方式都可行,但需要付出一些努力才能获得我想要的实例,而我想要的代理实例位于深层次结构中,继续展开或编写RemotingServices.GetRealProxy(myProxiedObject).Target(循环这个)非常繁琐.

我提出了两个解决方案,一个尝试从DebuggerTypeProxyAttribute.NET中获得一些帮助,但似乎没有这样做,因为我必须将此属性附加到RealProxy-derived类,我真的不想修改源代码InterceptingRealProxyUnity中的类代码.

另一种方式似乎是可行的,但我的课程设计有点扭曲.我添加了一个在我的代理包装的目标实例的基类中protected readonly调用的属性_rawInstance,因此我可以_rawInstance在我的监视窗口中看到它直接导致我原始的未包装对象.代码可能如下所示:

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

    (... some members, ignored)
}
Run Code Online (Sandbox Code Playgroud)

我想知道这个问题是否有更好的解决方案?任何信息或提示将非常感激.

小智 1

您可能想为此编写一个可视化工具。它是 Visual Studio 的一个插件,用于“可视化”任何监视值,您可以在其中执行任何您想做的操作,而不是在实际的项目代码中执行。