尝试方法'System.Web.Helpers.Json..cctor()'来访问方法'System.Web.Helpers.Json.CreateSerializer()'失败

我正在使用System.Web.Helpers.Json反序列化一些JSON dynamic在NET 4中。以下行失败,此错误: TypeInitializationException: Attempt by method 'System.Web.Helpers.Json..cctor()' to access method 'System.Web.Helpers.Json.CreateSerializer()' failed.

 var json = Json.Decode(response); 

response是漫长的,但有效的JSON。 这里可能是什么事? 我已经尝试用简短的手工JSON LINQPad ,它的工作。 这是一种configuration问题?

[编辑]

这里是实际的示例JSON。 看起来内容几乎无关紧要。 当它在全新的控制台应用程序或LINQPad中运行时,它按预期工作。 但是,如果您尝试从全新的Windows窗体应用程序运行相同的代码,则会出现上述错误。

 var json = Json.Decode("{\"r\":{\"0\":{\"id\":\"2\"},\"1\":{\"id\":\"33\"}}}"); 

[EDIT2]

事实上,这与项目types无关。 如果正在debugging项目,则会引发exception。 如果只是运行,则不会发生exception。 奇怪,呃?

我忘记了这个问题,同时我find了答案。 我认为这是微软Connect网站的某个地方,但我不确定。 现在让我们分享一下。

基本上,为了解决这个问题,您需要确保在“debugging”下的项目设置中, 选中 “启用Visual Studio宿主进程”。 我不知道为什么会发生,但这绝对是一种“修复”的方法。 一旦我发现这件事,我就停止寻找答案。 这对我来说已经够好了。

设置/调试

如果您正在运行部分信任,也会发生这种情况。 请查看这里的例外描述,查看可能的原因

我不知道这是否适用于您,因为您没有在networking环境中运行,但这是该链接描述的内容:

这种例外情况出现在以下情况中:

  • 使用reflection可以从部分受信任的代码访问不能从普通编译代码访问的私有,受保护或内部方法。

  • 从透明代码访问安全关键的方法。

  • 类库中方法的访问级别已更改,引用该库的一个或多个程序集尚未重新编译。

内置的JSON类有问题。

如果您想以其他方式实现此目的,请使用以下代码:

 JavaScriptSerializer serializer = new JavaScriptSerializer(); serializer.RegisterConverters(new DynamicJavaScriptConverter[] { new DynamicJavaScriptConverter() }); var result = WrapObject(serializer.DeserializeObject(value)); // here you will have result. private object WrapObject(object value) { IDictionary<string, object> values = value as IDictionary<string, object>; if (values != null) { return new DynamicJsonObject(values); } object[] arrayValues = value as object[]; if (arrayValues != null) { return new DynamicJsonArray(arrayValues); } return value; } 

除了Roland的回答:列出的一些程序集不匹配可以在AssemblyInfo.cs文件中修复。

AssemblyInfo中的违规行是这样的:

 [assembly: AllowPartiallyTrustedCallers] 

删除这使我可以访问我试图从dynamic加载该程序集的另一个程序集中设置的公共属性(在公共类上)。