web-dev-qa-db-fra.com

Échec de la tentative par la méthode 'System.Web.Helpers.Json..cctor ()' pour accéder à la méthode 'System.Web.Helpers.Json.CreateSerializer ()'

J'utilise System.Web.Helpers.Json Pour désérialiser du JSON en dynamic dans NET 4. La ligne suivante échoue avec cette erreur: TypeInitializationException: Attempt by method 'System.Web.Helpers.Json..cctor()' to access method 'System.Web.Helpers.Json.CreateSerializer()' failed.

var json = Json.Decode(response);

response est un JSON long mais valide. Quel pourrait être le problème ici? J'ai essayé LINQPad avec un court JSON artisanal et cela a fonctionné. Est-ce un problème de configuration quelconque?

[ÉDITER]

Voici l'exemple réel de JSON. Il semble que le contenu soit à peu près hors de propos. Lorsque cela est exécuté dans une toute nouvelle application console ou LINQPad, cela fonctionne comme prévu. Mais si vous essayez d'exécuter le même code à partir d'une toute nouvelle application Windows Forms, il échoue avec l'erreur ci-dessus.

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

[EDIT2]

En fait, il s'avère que cela n'a rien à voir avec les types de projets. L'exception est levée si le projet est en cours de débogage. S'il est simplement exécuté, l'exception ne se produit pas. Étrange, hein?

63
wpfwannabe

J'ai oublié cette question et j'ai trouvé ma réponse entre-temps. Je pense que c'était quelque part sur le site Connect de Microsoft, mais je ne suis pas sûr. Partageons-le maintenant.

Fondamentalement, pour contourner ce problème, vous devez vous assurer que "Activer le processus d'hébergement Visual Studio" est non coché dans les paramètres de votre projet sous Débogage. Je ne sais pas pourquoi cela se produit, mais c'est définitivement un moyen de le "réparer". J'ai arrêté de chercher des réponses une fois que j'ai découvert cela. C'était assez bon pour moi.

Settings / Debug

141
wpfwannabe

Cela peut également se produire si vous exécutez une approbation partielle. Vérifiez la description de l'exception ici pour des raisons possibles.

Je ne sais pas si cela s'appliquera à vous, puisque vous ne courez pas dans un contexte Web, mais voici ce que ce lien décrit:

Cette exception est levée dans des situations telles que les suivantes:

  • Une méthode privée, protégée ou interne qui ne serait pas accessible à partir du code compilé normal est accessible à partir du code partiellement approuvé en utilisant la réflexion.

  • Une méthode critique pour la sécurité est accessible à partir d'un code transparent.

  • Le niveau d'accès d'une méthode dans une bibliothèque de classes a changé et un ou plusieurs assemblys qui référencent la bibliothèque n'ont pas été recompilés.

7
Roland

Il y a un problème dans la classe json intégrée.

Si vous souhaitez y parvenir de manière alternative, veuillez utiliser le code ci-dessous:

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
VIRA

Suite à la réponse de Roland: certaines incompatibilités d'assembly répertoriées peuvent être corrigées dans le fichier AssemblyInfo.cs.

La ligne incriminée dans mon AssemblyInfo était la suivante:

[Assembly: AllowPartiallyTrustedCallers]

La suppression de cela m'a permis d'accéder à la propriété publique (sur une classe publique) que j'essayais de définir à partir d'un autre assembly qui avait chargé dynamiquement cet assembly.

1
JoelC