机器特定(??)行为将JSON字符串解析为DynamicJsonObject

时间:2015-02-16 08:42:50

标签: c# json visual-studio-2013

我有一大堆代码在没有调试器的情况下按预期运行,但是当我在调试器下运行它时,它在一台机器上工作而在另一台机器上运行失败。两台机器的设置基本相同: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运行应用程序,它就会失败。

这种特定于机器调试器的行为令人害怕 - 我害怕将代码放入生产中,这会产生这样的问题,(目前只能在调试器下观察,但谁知道......?)有人可以流下对此有何看法?

1 个答案:

答案 0 :(得分:1)

好的,我找到了原因 - here

转到工具>选项>调试和检查启用Just My Code 可以有效地解决问题。

该复选框正好是两种环境之间的差异。尝试在“工作”机器上取消选中它并在那里得到相同的例外,所以我可以确认这种行为是稳定和一致的(现在我很高兴)。

所以问题只是调试器试图遵循被调试的代码并读取动态对象的成员,而这些成员是创建动态对象的程序集的内部成员。这就是它在调试器下失败的原因,这就是为什么它在没有调试器的情况下运行时的原因。