尝试方法'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加载该程序集的另一个程序集中设置的公共属性(在公共类上)。