Попытка методом '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]

Удаление этого параметра позволило мне получить доступ к публичному свойству (в открытом классе), которое я пытался установить из другой сборки, которая динамически загрузила эту сборку.