web-dev-qa-db-ja.com

メソッド「System.Web.Helpers.Json..cctor()」によるメソッド「System.Web.Helpers.Json.CreateSerializer()」へのアクセスに失敗しました

NET 4で_System.Web.Helpers.Json_を使用してJSONをdynamicにデシリアライズします。次の行はこのエラーで失敗します: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 を試しましたが、うまくいきました。これは何らかの構成の問題ですか?

[編集]

実際のサンプルJSONは次のとおりです。コンテンツはほとんど無関係なようです。これを最新のコンソールアプリケーションまたはLINQPadで実行すると、期待どおりに機能します。ただし、新しいWindows Formsアプリケーションから同じコードを実行しようとすると、上記のエラーが発生します。

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

[編集2]

実際、これはプロジェクトの種類とは何の関係もありません。プロジェクトがデバッグされている場合、例外がスローされます。単純に実行する場合、例外は発生しません。奇妙な、え?

63
wpfwannabe

この質問を忘れて、その間に答えを見つけました。 MicrosoftのConnectサイトのどこかにあったと思いますが、よくわかりません。それでは、共有しましょう。

基本的に、この問題を回避するには、プロジェクトの[デバッグ]の設定で[Visual Studioホスティングプロセスを有効にする]が未チェックであることを確認する必要があります。なぜそれが起こっているのか分かりませんが、これは間違いなくそれを「修正」する方法です。このことを知ったとき、私は答えを探すのを止めました。それは私にとって十分でした。

Settings / Debug

141
wpfwannabe

これは、部分的な信頼で実行している場合にも発生する可能性があります。考えられる理由については、 例外の説明はこちら を確認してください。

あなたがウェブコンテキストで実行されていないので、これがあなたに当てはまるかどうかわかりませんが、これはそのリンクが説明するものです:

この例外は、次のような状況でスローされます。

  • 通常のコンパイル済みコードからアクセスできないプライベート、保護、または内部メソッドは、リフレクションを使用して部分的に信頼されたコードからアクセスされます。

  • セキュリティが重要な方法には、透過的なコードからアクセスします。

  • クラスライブラリのメソッドのアクセスレベルが変更され、ライブラリを参照する1つ以上のアセンブリが再コンパイルされていません。

7
Roland

組み込みの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
VIRA

Rolandの答えに加えて、リストされているいくつかのアセンブリの不一致はAssemblyInfo.csファイルで修正できます。

AssemblyInfoの問題のある行は次のとおりです。

[Assembly: AllowPartiallyTrustedCallers]

これを削除すると、このアセンブリを動的にロードした別のアセンブリから設定しようとしたパブリックプロパティ(パブリッククラス)にアクセスできました。

1
JoelC