Json.NET在.NET 4下说"操作可能会使运行时不稳定",但在.NET 3.5下则不行

Sco*_*man 5 .net json.net

这段代码:

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            var client = new WebClient();
            client.Headers.Add("User-Agent", "Nobody");
            var response = client.DownloadString(new Uri("http://www.hanselman.com/smallestdotnet/json.ashx"));

            var j = JsonConvert.DeserializeObject<SmallestDotNetThing>(response);
        }

        public class SmallestDotNetThing
        {
            public DotNetVersion latestVersion { get; set; }
            public List<DotNetVersion> allVersions { get; set; }
            public List<DotNetVersion> downloadableVersions { get; set; }
        }

        public class DotNetVersion
        {
            public int major { get; set; }
            public int minor { get; set; }
            public string profile { get; set; }
            public int? servicePack { get; set; }
            public string url { get; set; }
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

在.NET 4下使用.NET 4版本的JSON.NET时,将在Deserialize上抛出异常"操作可能会破坏运行时的稳定性".

但是,将目标切换到3.5(并将JSON.NET引用更改为3.5版本)效果很好.我正在使用NuGet的JSON.NET.

思考?

Jeh*_*hof 6

.NET 4运行时中的安全模型似乎发生了变化(请参阅Karel Zikmunds答案.NET安全博客条目),它依赖于AllowPartiallyTrustedCallersAttribute.

Karel还发布了一些解决方案:

你有这些选择:

  1. 如果您不需要APTCA,请将其删除.
  2. 从SDK运行SecAnnotate工具并修复所有违反透明度的行为 - http://blogs.msdn.com/b/shawnfa/archive/2009/11/18/using-secannotate-to-analyze-your-assemblies-for-transparency-violations -an-example.aspx.
  3. 使用Level1属性将程序集切换到v2安全模型 - http://blogs.msdn.com/b/shawnfa/archive/2009/11/11/transparency-models-a-tale-of-two-levels.aspx

关于Stackoverflow的另一篇文章,C#中的协方差和反演变量可能存在问题