ILを操作する意思がある場合、.netはモジュールイニシャライザーをサポートします
http://blogs.msdn.com/b/junfeng/archive/2005/11/19/494914.aspx
http://tech.einaregilsson.com/2009/12/16/module-initializers-in-csharp/
モジュール初期化子はSilverlightおよびWindowsPhone7でサポートされていますか?
ILを操作する意思がある場合、.netはモジュールイニシャライザーをサポートします
http://blogs.msdn.com/b/junfeng/archive/2005/11/19/494914.aspx
http://tech.einaregilsson.com/2009/12/16/module-initializers-in-csharp/
モジュール初期化子はSilverlightおよびWindowsPhone7でサポートされていますか?
モジュール初期化子をサポートしているのはC++/CLIのみです。そして、それは間接的なものであり、CRTを開始し、アンマネージ変数とオブジェクトを初期化するためにそれらを使用します。あなたはILで書く必要があります。試してみましたが、Silverlight4では問題なく動作しました。
.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
}
}
そのばかげた例では、モジュール初期化子はClass1の静的フィールドを設定します。次に、サンプルのSilverlightアプリでClass1のインスタンスを作成し、デバッガーで値を確認しました。
これとまったく同じコードは、WindowsPhoneエミュレーターでは機能しませんでした。TargetFrameworkAttributeを変更する必要がありましたが、実際にはこれを試しませんでした。それが問題の原因だとは思えません。