¿Los inicializadores de módulos son compatibles con Silverlight y Windows Phone 7?
-
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?
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.