簡體   English   中英

Attempt by method 'System.Web.Helpers.Json..cctor()' to access method 'System.Web.Helpers.Json.CreateSerializer()' failed

[英]Attempt by method 'System.Web.Helpers.Json..cctor()' to access method 'System.Web.Helpers.Json.CreateSerializer()' failed

I am using System.Web.Helpers.Json to deserialize some JSON into dynamic in NET 4. The following line fails with this error: 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]

實際上,事實證明這與項目類型無關。 如果正在調試項目,則會引發異常。 如果只是簡單地運行,則不會發生異常。 奇怪,嗯?

我忘記了這個問題,同時我找到了答案。 我認為它在 Microsoft 的 Connect 網站上的某個地方,但我不確定。 所以現在就分享給大家。

基本上,為了解決這個問題,您需要確保在調試下的項目設置中未選中“啟用 Visual Studio 托管進程”。 我不確定它為什么會發生,但這絕對是一種“修復”它的方法。 一旦我發現了這一點,我就停止尋找答案。 這對我來說已經足夠好了。

設置/調試

如果您在部分信任中運行,也會發生這種情況。 檢查 此處的異常描述以了解可能的原因。

我不知道這是否適用於您,因為您沒有在 web 上下文中運行,但這就是該鏈接所描述的內容:

在以下情況下會引發此異常:

  • 通過使用反射從部分受信任的代碼訪問無法從正常編譯代碼訪問的私有、受保護或內部方法。

  • 從透明代碼訪問安全關鍵方法。

  • class 庫中方法的訪問級別已更改,並且引用該庫的一個或多個程序集尚未重新編譯。

內置 json class 存在問題。

如果您想以其他方式實現此目的,請使用以下代碼:

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]

刪除它允許我訪問我試圖從另一個已動態加載此程序集的程序集設置的公共屬性(在公共類上)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM