Domanda

Se sei disposto a manipolare IL .NET Supporta Inizializzatori del modulo

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

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

I inizializzatori del modulo sono supportati in Silverlight e Windows Phone 7?

È stato utile?

Soluzione

Solo C ++/CLI supporta un inizializzatore del modulo. E questo è solo indirettamente, li usa per iniziare la CRT e per ottenere variabili e oggetti non gestiti inizializzati. Devi scrivere in IL. Ho provato, ha funzionato bene su 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
  }
}

È un esempio sciocco, l'inizializzatore del modulo imposta un campo statico di Classe1. Ho quindi creato un'istanza di Classe1 in un'app Silverlight campione e ho verificato il valore con il debugger.

Questo stesso identico codice ha fatto non Lavora nell'emulatore di Windows Phone. Avrei dovuto modificare TargetFrameworkAttribute, in realtà non ho provato questo. Dubito che sia la fonte del problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top