我有一大堆代码在没有调试器的情况下按预期运行,但是当我在调试器下运行它时,它在一台机器上工作而在另一台机器上运行失败。两台机器的设置基本相同:Windows 8,.NET Framework 4.5,Visual Studio 2013 Ultimate Update 4,我在两台机器上运行相同的控制台应用程序。
代码解析包含JSON的字符串:
{"success":true,"doAlternative":false,"errors":null,"content":null}
使用System.Web.Helpers进入动态对象:
dynamic result = Json.Decode(jsonString);
然后我访问结果对象的success
字段:
if ( result.success != true )
在一台机器上(我提醒:问题是在调试器下运行时),这才有效。另一方面,我得到RuntimeBinderException:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException occurred
_HResult=-2146233088
_message='System.Web.Helpers.DynamicJsonObject' does not contain a definition for 'success'
HResult=-2146233088
IsTransient=false
Message='System.Web.Helpers.DynamicJsonObject' does not contain a definition for 'success'
Source=Microsoft.CSharp
StackTrace:
at Microsoft.CSharp.RuntimeBinder.RuntimeBinderController.SubmitError(CError pError)
InnerException:
在“工作”机器上,当我在立即窗口中键入result
时,我得到:
{System.Web.Helpers.DynamicJsonObject}
base: {System.Web.Helpers.DynamicJsonObject}
在“失败”的机器上,我得到了这个:
{System.Web.Helpers.DynamicJsonObject}
base: {System.Web.Helpers.DynamicJsonObject}
_values: Count = 4
这是最奇怪的一点:在失败的机器上的立即窗口中播放,第一次键入result["success"]
给出了这个:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException occurred
_HResult=-2146233088
_message=Cannot apply indexing with [] to an expression of type 'System.Web.Helpers.DynamicJsonObject'
HResult=-2146233088
IsTransient=false
Message=Cannot apply indexing with [] to an expression of type 'System.Web.Helpers.DynamicJsonObject'
Source=Microsoft.CSharp
StackTrace:
at Microsoft.CSharp.RuntimeBinder.RuntimeBinderController.SubmitError(CError pError)
InnerException:
然后,再次输入result["success"]
第二次,让它工作!然后result.success
也有效。它不会打扰我,但如果我不放置断点并且只使用F5运行应用程序,它就会失败。
这种特定于机器调试器的行为令人害怕 - 我害怕将代码放入生产中,这会产生这样的问题,(目前只能在调试器下观察,但谁知道......?)有人可以流下对此有何看法?
答案 0 :(得分:1)
好的,我找到了原因 - here。
转到工具>选项>调试和检查启用Just My Code 可以有效地解决问题。
该复选框正好是两种环境之间的差异。尝试在“工作”机器上取消选中它并在那里得到相同的例外,所以我可以确认这种行为是稳定和一致的(现在我很高兴)。
所以问题只是调试器试图遵循被调试的代码并读取动态对象的成员,而这些成员是创建动态对象的程序集的内部成员。这就是它在调试器下失败的原因,这就是为什么它在没有调试器的情况下运行时的原因。