如果您在Reflector中检查C#代码,您会注意到编译器生成的特殊局部变量以模式CS $ X $ Y命名。这些变量(非正式地)记录在此答案中。
是否可以通过Visual Studio中的“监视”窗口或VS Debugger Extensibility API查看这些值?
我专门询问常规的Visual Studio调试器,请不要回答通过windbg / sos / sosex这是可能的-因为这不是我想要的。
不幸的是,使用C#EE无法做到这一点。这些本地人的名称确实存储在PDB中并且可用。但是,C#EE将在调试过程中过滤掉所有临时值以减少混乱。此过滤是无条件的,不能被覆盖。这里不是C#一个人,因为这是每种语言的行为。
好消息是,每种语言为其临时使用不同的命名方式。这意味着C#中的临时名称将在VB EE过滤之后运行。即使它是一个非法标识符,VB EE仍然认为它是有效的本地标识符(反之亦然)。因此,您只需要临时将C#代码的调试引擎切换到VB EE,就可以看到本地语言了。
这是怎么做的
HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0_Config\AD7Metrics\ExpressionEvaluator\{3F5162F8-07C6-11D3-9053-00C04FA302A1}\{994B45C4-E6E9-11D2-903F-00C04FA302A1}
{60F5556F-7EBC-4992-8E83-E9B49187FDE3}
为{59924502-559A-4BB1-B995-5D511BB218CD}
现在,每当调试C#代码时,它将使用VB EE,因此将临时显示为普通本地。请注意,这是完全不受支持的。但它应该工作正常。我可以在我的机器上看到此技巧的原始闭包值,并进行一些尝试而没有任何问题。
请注意,这些说明特定于Visual Studio2013。如果使用的是2012或2010,则应将注册表项名称中的12.0_Config更改为
除此之外,可能还需要进行一些调整(实际上未测试旧版本)。如果您遇到任何问题,请告诉我,我将尝试使其在本地运行并更新说明
完成更改后,这是最终输出的图片
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句