Попытка методом '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. Что тут может быть? Я пробовал LINQPad с коротким ручным JSON, и это сработало. Это какая-то проблема конфигурации?
[EDIT]
Вот пример JSON. Похоже, что контент почти не имеет значения. Когда это выполняется в новом консольном приложении или LINQPad, оно работает так, как ожидалось. Но если вы попытаетесь запустить тот же код из совершенно нового приложения Windows Forms, он запустит вышеуказанную ошибку.
var json = Json.Decode("{\"r\":{\"0\":{\"id\":\"2\"},\"1\":{\"id\":\"33\"}}}");
[EDIT2]
На самом деле, оказывается, это не имеет ничего общего с типами проектов. Исключение выдается, если проект отлаживается. Если он просто запущен, исключение не возникает. Странно, а??
Ответы
Ответ 1
Я забыл об этом вопросе, и тем временем я нашел ответ. Я думаю, что это было где-то на сайте Microsoft Connect, но я не уверен. Поэтому давайте поделиться им сейчас.
В принципе, чтобы обойти эту проблему, вам нужно убедиться, что "Включить хостинг Visual Studio" не отмечен в настройках вашего проекта в разделе "Отладка". Я не уверен, почему это происходит, но это определенно способ "исправить" его. Я прекратил искать ответы, как только узнал об этом. Это было достаточно для меня.
![Settings / Debug]()
Ответ 2
Это также может произойти, если вы работаете в частичном доверии.
Ниже приведено описание исключения здесь по следующим причинам.
Я не знаю, применит ли это к вам, поскольку вы не работаете в веб-контексте, но это то, что описывает эта ссылка:
Это исключение вызывается в таких ситуациях, как:
-
Доступ к частному, защищенному или внутреннему методу, который не будет доступен из обычного скомпилированного кода, доверенный код с помощью отражения.
-
Доступ к критическому критическому методу осуществляется из прозрачного кода.
-
Уровень доступа метода в библиотеке классов изменился, и одна или несколько сборок, которые ссылаются на библиотеку, не были перекомпилировать.
Ответ 3
Существует проблема во встроенном классе 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;
}
Ответ 4
В дополнение к ответу Роланда: перечисленные несоответствия сборки могут быть исправлены в файле AssemblyInfo.cs.
В моей AssemblyInfo была оскорбительная строка:
[assembly: AllowPartiallyTrustedCallers]
Удаление этого параметра позволило мне получить доступ к публичному свойству (в открытом классе), которое я пытался установить из другой сборки, которая динамически загрузила эту сборку.