この記事では、この API のリファレンス ドキュメントに補足的な解説を提供します。
MethodBuilder クラスは、名前、属性、シグネチャ、メソッド本体など、共通の中間言語 (CIL) のメソッドを完全に記述するために使用されます。 実行時にクラスを作成するために、 TypeBuilder クラスと組み合わせて使用されます。
リフレクション出力を使用すると、グローバル メソッドを定義したり、メソッドを型メンバーとして定義することができます。 メソッドを定義する API は、 MethodBuilder オブジェクトを返します。
グローバル メソッド
グローバル メソッドは、MethodBuilder
オブジェクトを返すModuleBuilder.DefineGlobalMethod メソッドを使用して定義されます。
グローバル メソッドは静的である必要があります。 動的モジュールにグローバル メソッドが含まれている場合、共通言語ランタイムは、すべてのグローバル関数が定義されるまで動的モジュールの修正を延期するため、動的モジュールまたは含まれている動的アセンブリを永続化する前に、 ModuleBuilder.CreateGlobalFunctions メソッドを呼び出す必要があります。
グローバル ネイティブ メソッドは、 ModuleBuilder.DefinePInvokeMethod メソッドを使用して定義されます。 プラットフォーム呼び出し (PInvoke) メソッドを抽象または仮想として宣言することはできません。 ランタイムは、プラットフォーム呼び出しメソッドの MethodAttributes.PinvokeImpl 属性を設定します。
型のメンバーとしてのメソッド
メソッドは、MethodBuilder オブジェクトを返すTypeBuilder.DefineMethod メソッドを使用して、型メンバーとして定義されます。
DefineParameter メソッドは、パラメーターの名前とパラメーター属性、または戻り値の属性を設定するために使用されます。 このメソッドによって返される ParameterBuilder オブジェクトは、パラメーターまたは戻り値を表します。 ParameterBuilder オブジェクトは、マーシャリングの設定、定数値の設定、およびカスタム属性の適用に使用できます。
属性
MethodAttributes列挙体のメンバーは、動的メソッドの正確な文字を定義します。
- 静的メソッドは、 MethodAttributes.Static 属性を使用して指定します。
- 最後のメソッド (オーバーライドできないメソッド) は、 MethodAttributes.Final 属性を使用して指定されます。
- 仮想メソッドは、 MethodAttributes.Virtual 属性を使用して指定します。
- 抽象メソッドは、 MethodAttributes.Abstract 属性を使用して指定します。
- いくつかの属性によって、メソッドの可視性が決まります。 MethodAttributes列挙体の説明を参照してください。
- オーバーロードされた演算子を実装するメソッドは、 MethodAttributes.SpecialName 属性を設定する必要があります。
- ファイナライザーは、 MethodAttributes.SpecialName 属性を設定する必要があります。
既知の問題
- MethodBuilderはMethodInfoから派生していますが、MethodInfo クラスで定義されている抽象メソッドの一部は、MethodBuilderで完全には実装されていません。 これらの MethodBuilder メソッドは、 NotSupportedExceptionをスローします。 たとえば、 MethodBuilder.Invoke メソッドは完全には実装されていません。 Type.GetTypeメソッドまたはAssembly.GetTypeメソッドを使用して外側の型を取得することで、これらのメソッドを反映できます。
- カスタム修飾子がサポートされています。
.NET