リフレクション出力によるメソッドの定義
更新 : 2007 年 11 月
ここでは、リフレクション出力を使用してグローバル メソッドを定義する方法と、型メンバとしてメソッドを定義する方法について説明します。メソッドを定義する API は MethodBuilder オブジェクトを返します。
MethodBuilder.AddDeclarativeSecurity メソッドは、作成されるメソッドに宣言セキュリティを追加します。AddDeclarativeSecurity を繰り返し呼び出すことができます。AddDeclarativeSecurity を呼び出すときには、セキュリティ アクション (Demand、Assert、Deny など) と、アクションの適用先アクセス許可セットを指定します。
グローバル メソッドを定義するには、ModuleBuilder.DefineGlobalMethod メソッドを使用します。DefineGlobalMethod は MethodBuilder を返します。
グローバル メソッドは静的メソッドである必要があります。動的モジュールにグローバル メソッドが含まれている場合には、動的モジュールまたはこのモジュールが格納されている動的アセンブリを永続化する前に、ModuleBuilder.CreateGlobalFunctions メソッドを呼び出す必要があります。これは、共通言語ランタイムでは、すべてのグローバル関数が定義された後で動的モジュールが固定化されるためです。
グローバル メソッドを定義するには、ModuleBuilder.DefinePInvokeMethod メソッドを使用します。プラットフォーム呼び出し (PInvoke) メソッドを抽象メソッドまたは仮想メソッドとして宣言しないでください。ランタイムによって、プラットフォーム呼び出しメソッドの MethodAttributes.PInvokeImpl 属性が設定されます。
メソッドは、TypeBuilder.DefineMethod メソッドを使用して、型メンバとして定義されます。DefineMethod は MethodBuilder を返します。
DefineParameter メソッドは、パラメータまたは戻り値の名前およびパラメータ属性を設定するために使用されます。このメソッドによって返される ParameterBuilder オブジェクトは、パラメータまたは戻り値を表します。ParameterBuilder オブジェクトは、マーシャリングの設定、定数値の設定、およびカスタム属性の適用に使用できます。
メモ : |
---|
.NET Framework Version 1.0 および 1.1 では、戻り値に対して DefineParameter メソッドを使用することはできません。 |
属性
静的メソッドを指定するには、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 Framework Version 2.0 では、カスタム修飾子がサポートされます。旧バージョンではサポートされていません。