2011-04-01 47 views
5

此代码:Json.NET说:“操作可能破坏运行时”下的.NET 4中,但不是在.NET 3.5

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; } 
     } 

    } 
} 

会抛出异常“操作可能破坏运行”的反序列化时使用.NET 4下的.NET 4版JSON.NET。

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

想法?

+0

我没有得到一个在我的机器上在.NET 4下运行相同的错误。有几个人表示他们遇到过这个错误,但我还没有弄清楚原因是什么。 – 2011-04-01 21:42:23

+0

奇怪。我在7 x64 SP1 ...你? – 2011-04-07 18:44:58

+0

Windows 7 x64也是如此。 – 2011-04-09 01:52:45

回答

6

.NET 4运行时中的安全模型似乎有所变化(请参阅Karel Zikmunds answer.NET Security Blog条目),它依赖于AllowPartiallyTrustedCallersAttribute。

卡雷尔也发布了一些选项来解决这个问题:

您有以下选择:

  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. 使用1级属性的组件切换到V2的安全模式 - http://blogs.msdn.com/b/shawnfa/archive/2009/11/11/transparency-models-a-tale-of-two-levels.aspx

另一个post#2,有可能是在C#与协变和逆变的问题

+0

在完全信任的过程中,这种安全性的东西是否重要? OP的例子看起来像一个完全信任的场景。 – CodesInChaos 2011-04-01 10:32:59

+1

我与CLR团队交谈过,他们也提出了这个建议。 – 2011-04-08 21:38:47

相关问题