.Netのモジュール初期化子の簡単な説明

私は最近、学生時代とdllmain関数を思い出しました。その後、私は考えました-.Netにも似たようなものがありますか?

結局のところ、このファミリーのすべての言語がサポートされていますが、サポートされているわけではありません。 この投稿は、このトピックに関する短い(しかし有益な)記事の翻訳です。





CLRバージョン1.0および1.1。 型初期化子がサポートされています。 多くの人がそれらに精通していますが、念のためECMA-335から絞り込みを提供します:CLRセクション2メタデータとファイル形式:



型(クラス、インターフェイス、値型)には、型自体を初期化するために使用される型初期化子と呼ばれる特別なメソッドがあります(同時に、アセンブリ自体の読み込み中ではなく、この型への最初の呼び出し時に呼び出されます- およそTransl )。 メソッドは静的で、パラメーターが0で、戻り値の型がなく、rtspecialnameおよびspecialnameとしてマークされ、.cctorと呼ばれる必要があります。



インスタンスコンストラクターと同様に、型初期化子は、initonly属性を使用して他の型の静的フィールドに書き込むことができます。



.class public EngineeringData extends [mscorlib]System.Object { .field private static initonly float64[] coefficient .method private specialname rtspecialname static void .cctor() cil managed { .maxstack 1 // allocate array of 4 Double ldc.i4.4 newarr [mscorlib]System.Double // point initonly field to new array stsfld float64[] EngineeringData::coefficient // code to initialize array elements goes here ret } }
      
      







発言
型初期化子は、通常、定数でフィールドを初期化するメソッド、または単純な計算を使用するメソッドです。 ただし、これらのメソッドのコードに制限はありません。





CLRバージョン2.0は、モジュール化された初期化子を提供します。 これらは型初期化子に似ていますが、唯一の違いはモジュール初期化子が型ではなくモジュールに関連付けられていることです。 なぜなら 型に関連付けられているのではなく、グローバル関数です。



モジュール初期化子の説明:



モジュールには、モジュールを自己初期化するためのモジュール初期化子と呼ばれる特別なメソッドが含まれている場合があります。

すべてのモジュールに初期化子を設定できます。 メソッドは静的で、モジュールのメンバーであり、パラメーターを0個取り、戻り値の型を持たず、rtspecialnameおよびspecialnameとしてマークされ、.cctorという名前を持っている必要があります。

これらのメソッドのコードに制限はありません。 モジュール初期化子は、マネージコードとアンマネージコードの両方を実行できます。



モジュールの初期化は以下を保証します。

  1. モジュール初期化子は、モジュールで定義された型、メソッド、またはデータの最初の呼び出し中、またはその少し前に実行されます。 モジュール内の初期化子自体の存在はオプションです。
  2. モジュール初期化子は、ユーザーコードによる初期化子の明示的な呼び出しを除き、モジュールごとに1回呼び出されます。
  3. モジュール初期化子から明示的または暗黙的に呼び出されたメソッドは、モジュール初期化子コードの実行が終了するまで、モジュールで宣言されたデータ、メソッド、または型にアクセスできません。


なぜなら C#にはグローバル関数はありません。その中にモジュール初期化子を作成することはできません。



MSDN VC ++ chatで説明されているように、C ++ / CLIはモジュール初期化子を内部的に使用します。 ( C ++ / CLIは、MSDN VC ++チャットスクリプトで説明されているように、モジュール初期化子を内部的に使用します。



次のコードは、msvcm80.dllモジュールのildasmでの逆コンパイルです。



 .method assembly specialname rtspecialname static void .cctor() cil managed { .custom instance void [mscorlib]System.Diagnostics.DebuggerStepThroughAttribute::.ctor() = ( 01 00 00 00 ) // Code size 39 (0x27) .maxstack 2 .locals ([0] valuetype '<CrtImplementationDetails>'.LanguageSupport languageSupport) IL_0000: ldloca.s languageSupport IL_0002: call valuetype '<CrtImplementationDetails>'.LanguageSupport* modopt([mscorlib]System.Runtime.CompilerServices.CallConvThiscall) '<CrtImplementationDetails>.LanguageSupport.{ctor}'(valuetype '<CrtImplementationDetails>'.LanguageSupport* modopt([mscorlib]System.Runtime.CompilerServices.IsConst) modopt([mscorlib]System.Runtime.CompilerServices.IsConst)) IL_0007: pop .try { IL_0008: ldloca.s languageSupport IL_000a: call void modopt([mscorlib]System.Runtime.CompilerServices.CallConvThiscall) '<CrtImplementationDetails>.LanguageSupport.Initialize'(valuetype '<CrtImplementationDetails>'.LanguageSupport* modopt([mscorlib]System.Runtime.CompilerServices.IsConst) modopt([mscorlib]System.Runtime.CompilerServices.IsConst)) IL_000f: leave.s IL_001f } // end .try fault { IL_0011: ldftn void modopt([mscorlib]System.Runtime.CompilerServices.CallConvThiscall) '<CrtImplementationDetails>.LanguageSupport.{dtor}'(valuetype '<CrtImplementationDetails>'.LanguageSupport* modopt([mscorlib]System.Runtime.CompilerServices.IsConst) modopt([mscorlib]System.Runtime.CompilerServices.IsConst)) IL_0017: ldloca.s languageSupport IL_0019: call void ___CxxCallUnwindDtor(method void *(void*), void*) IL_001e: endfinally } // end handler IL_001f: ldloca.s languageSupport IL_0021: call void modopt([mscorlib]System.Runtime.CompilerServices.CallConvThiscall) 'gcroot<System::String ^>.{dtor}'(valuetype 'gcroot<System::String ^>'* modopt([mscorlib]System.Runtime.CompilerServices.IsConst) modopt([mscorlib]System.Runtime.CompilerServices.IsConst)) IL_0026: ret } // end of method 'Global Functions'::.cctor
      
      






All Articles