¿Los inicializadores de módulos son compatibles con Silverlight y Windows Phone 7?

StackOverflow https://stackoverflow.com/questions/5365994

  •  27-10-2019
  •  | 
  •  

Pregunta

Si está dispuesto a manipular IL .NET admite inicializadores de módulos

http://blogs.msdn.com/b/junfeng/archive/2005/11/19/494914.aspx

http://tech.einaregilsson.com/2009/12/16/module-initializers-in-csharp/

¿Los inicializadores de módulos son compatibles con Silverlight y Windows Phone 7?

¿Fue útil?

Solución

Solo C ++/CLI admite un inicializador de módulo. Y eso es solo indirectamente, los usa para comenzar el CRT y inicializarse variables y objetos no administrados. Tienes que escribir en IL. Lo intenté, funcionó bien en Silverlight 4:

.assembly extern mscorlib
{
  .publickeytoken = (7C EC 85 D7 BE A7 79 8E )
  .ver 2:0:5:0
}

.assembly test
{
  .custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78
                                                                                                               63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 )
  .custom instance void [mscorlib]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string) = ( 01 00 18 53 69 6C 76 65 72 6C 69 67 68 74 2C 56
                                                                                                        65 72 73 69 6F 6E 3D 76 34 2E 30 01 00 54 0E 14
                                                                                                        46 72 61 6D 65 77 6F 72 6B 44 69 73 70 6C 61 79
                                                                                                        4E 61 6D 65 0D 53 69 6C 76 65 72 6C 69 67 68 74
                                                                                                        20 34 )                                    
  .hash algorithm 0x00008004
  .ver 1:0:0:0
}

.method assembly specialname rtspecialname static void .cctor() cil managed
{
  ldc.i4.s   42
  stsfld     int32 Example.Class1::test
  ret
}

.class public auto ansi beforefieldinit Example.Class1
       extends [mscorlib]System.Object
{
  .field public static int32 test
  .method public hidebysig specialname rtspecialname 
          instance void  .ctor() cil managed
  {
    .maxstack 8
    ldarg.0
    call       instance void [mscorlib]System.Object::.ctor()
    ret
  }
}

Es un ejemplo tonto, el inicializador del módulo establece un campo estático de clase1. Luego creé una instancia de Class1 en una aplicación Silverlight de muestra y verifiqué el valor con el depurador.

Este mismo código exacto hizo no Trabaja en el emulador de Windows Phone. Debería haber modificado el TargetFrameWorkAttribute, en realidad no intenté esto. Dudo que sea la fuente del problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top