2011-04-01 15 views
5

este código:Json.NET dice "operación puede desestabilizar el tiempo de ejecución" bajo .NET 4, pero no bajo .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; } 
     } 

    } 
} 

arrojará una excepción "operación puede desestabilizar la ejecución" en la Deserialize cuando utilizando la versión .NET 4 de JSON.NET en .NET 4.

Sin embargo, cambiar el destino a 3.5 (y cambiar la referencia JSON.NET a la versión 3.5) funciona muy bien. Estoy usando el JSON.NET de NuGet.

¿Pensamientos?

+0

no consigo una error al ejecutar el mismo en .NET 4 en mi máquina. Un par de personas han dicho que han experimentado este error, pero todavía no he podido averiguar cuál es la causa. –

+0

Extraño. Estoy en 7 x64 SP1 ... ¿tú? –

+0

Windows 7 x64 también. –

Respuesta

6

Parece haber un cambio en el Modelo de seguridad en el tiempo de ejecución de .NET 4 (consulte Karel Zikmunds answer y la entrada .NET Security Blog) que se basa en AllowPartiallyTrustedCallersAttribute.

Karel también publicado algunas opciones para resolverlo:

Usted tiene las siguientes opciones:

  1. Si usted no necesita APTCA, eliminarlo.
  2. Ejecute la herramienta SecAnnotar de SDK y corrija todas las violaciones de transparencia: http://blogs.msdn.com/b/shawnfa/archive/2009/11/18/using-secannotate-to-analyze-your-assemblies-for-transparency-violations-an-example.aspx.
  3. atributo
  4. Uso Nivel 1 para cambiar su ensamblaje con el modelo de seguridad v2 - http://blogs.msdn.com/b/shawnfa/archive/2009/11/11/transparency-models-a-tale-of-two-levels.aspx

Otra post en Stackoverflow que puede haber un problema con la covarianza y contravarianza en C#

+0

¿Eso de seguridad importa en absoluto en un proceso de plena confianza? El ejemplo de OP parece un escenario de confianza completa. – CodesInChaos

+1

Hablé con el equipo de CLR y ellos sugirieron esto también. –

Cuestiones relacionadas