目前,我正在研究一个调试主题,以改进从联合的__TransparentProxy中解析的对TransparentProxyInterceptor实例的调试。
常见的调试场景是,当程序中断时,我希望看到公共成员值,或者在VS2008 IDE中的监视窗口或立即窗口中调用代理包装实例上的方法。
出现了一个问题:在访问公共属性或在代理包装的实例上调用方法时,我总是会遇到显示在Watch /即时窗口中的异常消息。
‘无法获得'MyDomainObject’类型实例上的字段或调用方法,因为它是远程对象‘的代理。
我深入研究了web上的线程,发现导致此异常的原因是.NET __transparentProxy的内部反射行为。__transparentProxy实例无法访问基础在__transparentProxy实例本身中的RealProxy实例上的相应属性/方法。
AFAIK,有两种方法(没有任何设计或外部工具的帮助)来获得我想要的价值。一种是继续在“观察”窗口中展开和展开私有成员值,在几次单击之后,我最终可以访问没有代理的原始实例,我可以在该实例上做我想做的任何事情。另一种方法要快得多,但每次您想要访问原始的未代理实例:RemotingServices.GetRealProxy(myProxiedObject).Target时,仍然要付出一点努力。
这两种方法都是可行的,但需要付出一些努力才能得到我想要的实例,虽然我想要的代理实例驻留在一个深层次结构中,但是继续展开或编写RemotingServices.GetRealProxy(myProxiedObject).Target (循环这个)是非常繁琐的。
我想出了两种解决方案,一种是尝试从DebuggerTypeProxyAttribute获得.NET中的一些帮助,但似乎没有做到这一点,因为我必须将这个属性附加到RealProxy-derived类中,而且我真的不想修改Unity InterceptingRealProxy类的源代码。
另一种方式似乎可行,但稍微扭曲了我的课程设计。我在代理包装的目标实例的基类中添加了一个名为protected readonly的_rawInstance属性,这样我就可以在监视窗口中看到_rawInstance,这将直接引导我找到原始的未包装对象。代码可能如下所示:
public class MyDomainBase : MarshalByRefObject
{
protected MyDomainBase _rawInstance
{
get{ return this; }
}
(... some members, ignored)
}我想知道这个问题是否有更好的解决办法?如有任何信息或建议,将不胜感激。
发布于 2012-06-09 20:52:04
您可能需要为此编写一个可视化工具。它是Visual的一个插件,用于“可视化”任何手表值,您可以在那里做任何您想做的事情,而不是在实际的项目代码中。
https://stackoverflow.com/questions/4517843
复制相似问题