我目前正在开发一个调试主题,以改进从Unity __TransparentProxy
解析的TransparentProxyInterceptor
实例的调试。
常见的调试方案是,当程序崩溃时,我希望在监视窗口或VS2008 IDE中的立即窗口中看到公共成员值或在代理程序包装的实例上调用该方法。
问题出现了:在我的代理程序包装的实例上访问公共属性或调用方法时,我总是遇到Watch / Immediate窗口中显示的异常消息,
'无法在类型'MyDomainObject'的实例上获取字段或调用方法,因为它是远程对象的代理。'
我已经挖掘了网络上的线程,并发现此异常的原因是由于.NET __transparentProxy
的内部反射行为。 __transparentProxy
实例无法访问RealProxy
实例本身底层的__transparentProxy
实例上的相应属性/方法。
AFAIK,有两种方式(没有外部工具的任何设计或帮助)来获得我想要的价值。一个是在Watch窗口中继续展开和展开私有成员值,经过几次点击后,我终于可以访问无需代理的原始实例,我可以在其上做任何我想做的事情。另一种方式更快,但每次要访问原始未经处理的实例时仍需要花费一些精力:RemotingServices.GetRealProxy(myProxiedObject).Target
无论哪种方式都可行,但需要付出一些努力才能获得我想要的实例,而我想要的代理实例位于深层次结构中,继续展开或编写RemotingServices.GetRealProxy(myProxiedObject).Target
(循环显示)是非常繁琐的。 / p>
我提出了两个解决方案,一个尝试从.NET中的DebuggerTypeProxyAttribute
获得一些帮助,但似乎没有这样做,因为我必须将此属性附加到RealProxy
- 派生类,我真的不想修改Unity中InterceptingRealProxy
类的源代码。
另一种方式似乎可行但是我的班级设计有点扭曲。我在代理程序包装的目标实例的基类中添加了一个名为protected readonly
的{{1}}属性,因此我可以在监视窗口中看到_rawInstance
,它直接指向我原始的未包装对象。代码可能如下所示:
_rawInstance
我想知道这个问题是否有更好的解决方案?任何信息或提示将非常感激。
答案 0 :(得分:1)
您可能想为此编写可视化工具。它是Visual Studio的一个插件,用于“可视化”任何手表值,您可以在那里做任何你想做的事情,而不是在你的实际项目代码中。