DynamicMethod クラス
アセンブリ: mscorlib (mscorlib.dll 内)


DynamicMethod クラスを使用すると、実行時にメソッドを生成し実行できます。メソッドを格納するために、動的アセンブリと動的型を生成する必要はありません。動的メソッドは、少量のコードを生成し実行するための最も効率的な方法です。
動的メソッドは、モジュールまたは型に論理的に関連付けられます。動的メソッドがモジュールに関連付けられている場合、そのモジュールに対して実質的にはグローバルです。十分なアクセス許可があれば、動的メソッドはジャスト イン タイム (JIT: Just-In-Time) の参照範囲チェックをスキップし、そのモジュール内で宣言されている型のプライベート データにアクセスできます。開発者がそのモジュールを作成したかどうかに関係なく、動的メソッドはどのモジュールにでも関連付けることができます。
動的メソッドが型に関連付けられている場合、その型のプライベート メンバにアクセスできます。動的メソッドが同じモジュール内で宣言されている他の型のプライベート データにアクセスしない場合は、JIT の参照範囲チェックをスキップする必要はありません。動的メソッドは、どの型にも関連付けることができます。
モジュールまたはモジュール内の型に関連付けられた動的メソッドについて、JIT の参照範囲チェックを行う場合およびスキップする場合に、動的メソッドにアクセス可能なモジュール内の型のメンバを次の表に示します。
| ||
動的メソッドは、関連付けられているモジュール、または関連付けられている型を格納するモジュールのアクセス許可を持ちます。
動的メソッドとそのパラメータには、名前を付ける必要はありませんが、名前を指定するとデバッグを行う際に役立ちます。動的メソッドまたはそのパラメータでは、カスタム属性はサポートされていません。
動的メソッドは static メソッド (Visual Basic では Shared メソッド) ですが、.NET Framework Version 2.0 に導入されているデリゲート バインディングの緩やかな規則では、動的メソッドをオブジェクトにバインドすることが許可されています。したがって、そのデリゲート インスタンスを使用して動的メソッドを呼び出した場合、インスタンス メソッドと同様に機能します。この例については、CreateDelegate(Type,Object) メソッド オーバーロードで説明しています。

2 つのパラメータを使用する動的メソッドを作成するコード例を次に示します。この例では、コンソールに 1 つ目のパラメータを出力する簡単な関数本体を出力し、2 つ目のパラメータをメソッドの戻り値として使用しています。この例では、デリゲートを作成することによってメソッドを完了し、さまざまなパラメータを持つデリゲートを呼び出し、最後に Invoke メソッドを使用して動的メソッドを呼び出します。
Imports System Imports System.Reflection Imports System.Reflection.Emit Imports Microsoft.VisualBasic Imports System.Globalization Public Class Test ' Declare a delegate type that can be used to execute the completed ' dynamic method. Private Delegate Function HelloDelegate(ByVal msg As String, _ ByVal ret As Integer) As Integer Public Shared Sub Main() ' Create an array that specifies the types of the parameters ' of the dynamic method. This dynamic method has a String ' parameter and an Integer parameter. Dim helloArgs() As Type = {GetType(String), GetType(Integer)} ' Create a dynamic method with the name "Hello", a return type ' of Integer, and two parameters whose types are specified by ' the array helloArgs. Create the method in the module that ' defines the String class. Dim hello As New DynamicMethod("Hello", _ GetType(Integer), _ helloArgs, _ GetType(String).Module) ' Create an array that specifies the parameter types of the ' overload of Console.WriteLine to be used in Hello. Dim writeStringArgs() As Type = {GetType(String)} ' Get the overload of Console.WriteLine that has one ' String parameter. Dim writeString As MethodInfo = GetType(Console). _ GetMethod("WriteLine", writeStringArgs) ' Get an ILGenerator and emit a body for the dynamic method , ' using a stream size larger than the IL that will be ' emitted. Dim il As ILGenerator = hello.GetILGenerator(256) ' Load the first argument, which is a string, onto the stack. il.Emit(OpCodes.Ldarg_0) ' Call the overload of Console.WriteLine that prints a string. il.EmitCall(OpCodes.Call, writeString, Nothing) ' The Hello method returns the value of the second argument; ' to do this, load the onto the stack and return. il.Emit(OpCodes.Ldarg_1) il.Emit(OpCodes.Ret) ' Display MethodAttributes for the dynamic method, set when ' the dynamic method was created. Console.WriteLine(vbCrLf & "Method Attributes: {0}", _ hello.Attributes) ' Display the calling convention of the dynamic method, set when the ' dynamic method was created. Console.WriteLine(vbCrLf & "Calling convention: {0}", _ hello.CallingConvention) ' Display the declaring type, which is always Nothing for dynamic ' methods. If hello.DeclaringType Is Nothing Then Console.WriteLine(vbCrLf & "DeclaringType is always Nothing for dynamic methods.") Else Console.WriteLine("DeclaringType: {0}", hello.DeclaringType) End If ' Display the default value for InitLocals. If hello.InitLocals Then Console.Write(vbCrLf & "This method contains verifiable code.") Else Console.Write(vbCrLf & "This method contains unverifiable code.") End If Console.WriteLine(" (InitLocals = {0})", hello.InitLocals) ' Display the module specified when the dynamic method was created. Console.WriteLine(vbCrLf & "Module: {0}", hello.Module) ' Display the name specified when the dynamic method was created. ' Note that the name can be blank. Console.WriteLine(vbCrLf & "Name: {0}", hello.Name) ' For dynamic methods, the reflected type is always Nothing. If hello.ReflectedType Is Nothing Then Console.WriteLine(vbCrLf & "ReflectedType is Nothing.") Else Console.WriteLine(vbCrLf & "ReflectedType: {0}", _ hello.ReflectedType) End If If hello.ReturnParameter Is Nothing Then Console.WriteLine(vbCrLf & "Method has no return parameter.") Else Console.WriteLine(vbCrLf & "Return parameter: {0}", _ hello.ReturnParameter) End If ' If the method has no return type, ReturnType is System.Void. Console.WriteLine(vbCrLf & "Return type: {0}", hello.ReturnType) ' ReturnTypeCustomAttributes returns an ICustomeAttributeProvider ' that can be used to enumerate the custom attributes of the ' return value. At present, there is no way to set such custom ' attributes, so the list is empty. If hello.ReturnType Is GetType(System.Void) Then Console.WriteLine("The method has no return type.") Else Dim caProvider As ICustomAttributeProvider = _ hello.ReturnTypeCustomAttributes Dim returnAttributes() As Object = _ caProvider.GetCustomAttributes(True) If returnAttributes.Length = 0 Then Console.WriteLine(vbCrLf _ & "The return type has no custom attributes.") Else Console.WriteLine(vbCrLf _ & "The return type has the following custom attributes:") For Each attr As Object In returnAttributes Console.WriteLine(vbTab & attr.ToString()) Next attr End If End If Console.WriteLine(vbCrLf & "ToString: " & hello.ToString()) ' Add parameter information to the dynamic method. (This is not ' necessary, but can be useful for debugging.) For each parameter , ' identified by position, supply the parameter attributes and a ' parameter name. Dim parameter1 As ParameterBuilder = hello.DefineParameter( _ 1, ParameterAttributes.In, "message") Dim parameter2 As ParameterBuilder = hello.DefineParameter( _ 2, ParameterAttributes.In, "valueToReturn") ' Display parameter information. Dim parameters() As ParameterInfo = hello.GetParameters() Console.WriteLine(vbCrLf & "Parameters: name, type, ParameterAttributes") For Each p As ParameterInfo In parameters Console.WriteLine(vbTab & "{0}, {1}, {2}", _ p.Name, p.ParameterType, p.Attributes) Next p ' Create a delegate that represents the dynamic method. This ' action completes the method, and any further attempts to ' change the method will cause an exception. Dim hi As HelloDelegate = _ CType(hello.CreateDelegate(GetType(HelloDelegate)), HelloDelegate) ' Use the delegate to execute the dynamic method. Console.WriteLine(vbCrLf & "Use the delegate to execute the dynamic method:") Dim retval As Integer = hi(vbCrLf & "Hello, World!", 42) Console.WriteLine("Invoking delegate hi(""Hello, World!"", 42) returned: " _ & retval & ".") ' Execute it again, with different arguments. retval = hi(vbCrLf & "Hi, Mom!", 5280) Console.WriteLine("Invoking delegate hi(""Hi, Mom!"", 5280) returned: " _ & retval & ".") Console.WriteLine(vbCrLf & "Use the Invoke method to execute the dynamic method:") ' Create an array of arguments to use with the Invoke method. Dim invokeArgs() As Object = {vbCrLf & "Hello, World!", 42} ' Invoke the dynamic method using the arguments. This is much ' slower than using the delegate, because you must create an ' array to contain the arguments, and value-type arguments ' must be boxed. Dim objRet As Object = hello.Invoke(Nothing, _ BindingFlags.ExactBinding, Nothing, invokeArgs, _ New CultureInfo("en-us")) Console.WriteLine("hello.Invoke returned: {0}", objRet) End Sub End Class ' This code example produces the following output: ' 'Method Attributes: PrivateScope, Public, Static ' 'Calling convention: Standard ' 'DeclaringType is always Nothing for dynamic methods. ' 'This method contains verifiable code. (InitLocals = True) ' 'Module: CommonLanguageRuntimeLibrary ' 'Name: Hello ' 'ReflectedType is Nothing. ' 'Method has no return parameter. ' 'Return type: System.Int32 ' 'The return type has no custom attributes. ' 'ToString: Int32 Hello(System.String, Int32) ' 'Parameters: name, type, ParameterAttributes ' message, System.String, In ' valueToReturn, System.Int32, In ' 'Use the delegate to execute the dynamic method: ' 'Hello, World! 'Invoking delegate hi("Hello, World!", 42) returned: 42. ' 'Hi, Mom! 'Invoking delegate hi("Hi, Mom!", 5280) returned: 5280. ' 'Use the Invoke method to execute the dynamic method: ' 'Hello, World! 'hello.Invoke returned: 42
using System; using System.Reflection; using System.Reflection.Emit; using System.Globalization; public class Test { // Declare a delegate type that can be used to execute the completed // dynamic method. private delegate int HelloDelegate(string msg, int ret); public static void Main() { // Create an array that specifies the types of the parameters // of the dynamic method. This dynamic method has a String // parameter and an Integer parameter. Type[] helloArgs = {typeof(string), typeof(int)}; // Create a dynamic method with the name "Hello", a return type // of Integer, and two parameters whose types are specified by // the array helloArgs. Create the method in the module that // defines the String class. DynamicMethod hello = new DynamicMethod("Hello", typeof(int), helloArgs, typeof(string).Module); // Create an array that specifies the parameter types of the // overload of Console.WriteLine to be used in Hello. Type[] writeStringArgs = {typeof(string)}; // Get the overload of Console.WriteLine that has one // String parameter. MethodInfo writeString = typeof(Console).GetMethod("WriteLine", writeStringArgs); // Get an ILGenerator and emit a body for the dynamic method , // using a stream size larger than the IL that will be // emitted. ILGenerator il = hello.GetILGenerator(256); // Load the first argument, which is a string, onto the stack. il.Emit(OpCodes.Ldarg_0); // Call the overload of Console.WriteLine that prints a string. il.EmitCall(OpCodes.Call, writeString, null); // The Hello method returns the value of the second argument; // to do this, load the onto the stack and return. il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ret); // Display MethodAttributes for the dynamic method, set when // the dynamic method was created. Console.WriteLine("\r\nMethod Attributes: {0}", hello.Attributes); // Display the calling convention of the dynamic method, set when the // dynamic method was created. Console.WriteLine("\r\nCalling convention: {0}", hello.CallingConvention); // Display the declaring type, which is always null for dynamic // methods. if (hello.DeclaringType==null) { Console.WriteLine("\r\nDeclaringType is always null for dynamic methods."); } else { Console.WriteLine("DeclaringType: {0}", hello.DeclaringType); } // Display the default value for InitLocals. if (hello.InitLocals) { Console.Write("\r\nThis method contains verifiable code."); } else { Console.Write("\r\nThis method contains unverifiable code."); } Console.WriteLine(" (InitLocals = {0})", hello.InitLocals); // Display the module specified when the dynamic method was created. Console.WriteLine("\r\nModule: {0}", hello.Module); // Display the name specified when the dynamic method was created. // Note that the name can be blank. Console.WriteLine("\r\nName: {0}", hello.Name); // For dynamic methods, the reflected type is always null. if (hello.ReflectedType==null) { Console.WriteLine("\r\nReflectedType is null."); } else { Console.WriteLine("\r\nReflectedType: {0}", hello.ReflectedType); } if (hello.ReturnParameter==null) { Console.WriteLine("\r\nMethod has no return parameter."); } else { Console.WriteLine("\r\nReturn parameter: {0}", hello.ReturnParameter); } // If the method has no return type, ReturnType is System.Void. Console.WriteLine("\r\nReturn type: {0}", hello.ReturnType); // ReturnTypeCustomAttributes returns an ICustomeAttributeProvider // that can be used to enumerate the custom attributes of the // return value. At present, there is no way to set such custom // attributes, so the list is empty. if (hello.ReturnType == typeof(void)) { Console.WriteLine("The method has no return type."); } else { ICustomAttributeProvider caProvider = hello.ReturnTypeCustomAttributes; object[] returnAttributes = caProvider.GetCustomAttributes(true); if (returnAttributes.Length==0) { Console.WriteLine("\r\nThe return type has no custom attributes."); } else { Console.WriteLine("\r\nThe return type has the following custom attributes:"); foreach( object attr in returnAttributes ) { Console.WriteLine("\t{0}", attr.ToString()); } } } Console.WriteLine("\r\nToString: {0}", hello.ToString()); // Add parameter information to the dynamic method. (This is not // necessary, but can be useful for debugging.) For each parameter , // identified by position, supply the parameter attributes and a // parameter name. ParameterBuilder parameter1 = hello.DefineParameter( 1, ParameterAttributes.In, "message" ); ParameterBuilder parameter2 = hello.DefineParameter( 2, ParameterAttributes.In, "valueToReturn" ); // Display parameter information. ParameterInfo[] parameters = hello.GetParameters(); Console.WriteLine("\r\nParameters: name, type, ParameterAttributes"); foreach( ParameterInfo p in parameters ) { Console.WriteLine("\t{0}, {1}, {2}", p.Name, p.ParameterType, p.Attributes); } // Create a delegate that represents the dynamic method. This // action completes the method, and any further attempts to // change the method will cause an exception. HelloDelegate hi = (HelloDelegate) hello.CreateDelegate(typeof(HelloDelegate)); // Use the delegate to execute the dynamic method. Console.WriteLine("\r\nUse the delegate to execute the dynamic method:"); int retval = hi("\r\nHello, World!", 42); Console.WriteLine("Invoking delegate hi(\"Hello, World!\", 42) returned: " + retval); // Execute it again, with different arguments. retval = hi("\r\nHi, Mom!", 5280); Console.WriteLine("Invoking delegate hi(\"Hi, Mom!\", 5280) returned: " + retval); Console.WriteLine("\r\nUse the Invoke method to execute the dynamic method:"); // Create an array of arguments to use with the Invoke method. object[] invokeArgs = {"\r\nHello, World!", 42}; // Invoke the dynamic method using the arguments. This is much // slower than using the delegate, because you must create an // array to contain the arguments, and value-type arguments // must be boxed. object objRet = hello.Invoke(null, BindingFlags.ExactBinding, null, invokeArgs, new CultureInfo("en-us")); Console.WriteLine("hello.Invoke returned: " + objRet); } } /* This code example produces the following output: Method Attributes: PrivateScope, Public, Static Calling convention: Standard DeclaringType is always null for dynamic methods. This method contains verifiable code. (InitLocals = True) Module: CommonLanguageRuntimeLibrary Name: Hello ReflectedType is null. Method has no return parameter. Return type: System.Int32 The return type has no custom attributes. ToString: Int32 Hello(System.String, Int32) Parameters: name, type, ParameterAttributes message, System.String, In valueToReturn, System.Int32, In Use the delegate to execute the dynamic method: Hello, World! Invoking delegate hi("Hello, World!", 42) returned: 42 Hi, Mom! Invoking delegate hi("Hi, Mom!", 5280) returned: 5280 Use the Invoke method to execute the dynamic method: Hello, World! hello.Invoke returned: 42 */

System.Reflection.MemberInfo
System.Reflection.MethodBase
System.Reflection.MethodInfo
System.Reflection.Emit.DynamicMethod


Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


DynamicMethod コンストラクタ (String, MethodAttributes, CallingConventions, Type, Type[], Module, Boolean)
アセンブリ: mscorlib (mscorlib.dll 内)

Public Sub New ( _ name As String, _ attributes As MethodAttributes, _ callingConvention As CallingConventions, _ returnType As Type, _ parameterTypes As Type(), _ m As Module, _ skipVisibility As Boolean _ )
Dim name As String Dim attributes As MethodAttributes Dim callingConvention As CallingConventions Dim returnType As Type Dim parameterTypes As Type() Dim m As Module Dim skipVisibility As Boolean Dim instance As New DynamicMethod(name, attributes, callingConvention, returnType, parameterTypes, m, skipVisibility)
public DynamicMethod ( string name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes, Module m, bool skipVisibility )
public: DynamicMethod ( String^ name, MethodAttributes attributes, CallingConventions callingConvention, Type^ returnType, array<Type^>^ parameterTypes, Module^ m, bool skipVisibility )
public DynamicMethod ( String name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes, Module m, boolean skipVisibility )
public function DynamicMethod ( name : String, attributes : MethodAttributes, callingConvention : CallingConventions, returnType : Type, parameterTypes : Type[], m : Module, skipVisibility : boolean )

例外の種類 | 条件 |
---|---|
ArgumentException | parameterTypes の要素が null 参照 (Visual Basic では Nothing) または Void です。 |
ArgumentNullException | name が null 参照 (Visual Basic では Nothing) です。 または m が null 参照 (Visual Basic では Nothing) です。 |
NotSupportedException | attributes が Public と Static 以外のフラグの組み合わせです。 または callingConvention が Standard ではありません。 または |

このコンストラクタで作成した動的メソッドは、m モジュールに格納されたすべての型のパブリック メンバと internal (Visual Basic では Friend) メンバにアクセスできます。JIT コンパイラの参照範囲チェックをスキップすると、動的メソッドはモジュール内のすべての型のプライベート メンバとプロテクト メンバにもアクセスできるようになります。たとえば、これはオブジェクトをシリアル化するコードを記述する場合に役立ちます。

- ReflectionPermission (コードを出力するために必要なアクセス許可)。ReflectionPermissionFlag.ReflectionEmit (関連する列挙体)
- ReflectionPermission (skipVisibility が true の場合に、JIT の参照範囲チェックをスキップするために必要なアクセス許可)。ReflectionPermissionFlag.MemberAccess (関連する列挙体)
- SecurityPermission (呼び出し元のモジュール以外のモジュールに関連付けられている場合に、証拠を制御するために必要なアクセス許可)。SecurityPermissionFlag.ControlEvidence (関連する列挙体)

Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


DynamicMethod コンストラクタ (String, MethodAttributes, CallingConventions, Type, Type[], Type, Boolean)
アセンブリ: mscorlib (mscorlib.dll 内)

Public Sub New ( _ name As String, _ attributes As MethodAttributes, _ callingConvention As CallingConventions, _ returnType As Type, _ parameterTypes As Type(), _ owner As Type, _ skipVisibility As Boolean _ )
Dim name As String Dim attributes As MethodAttributes Dim callingConvention As CallingConventions Dim returnType As Type Dim parameterTypes As Type() Dim owner As Type Dim skipVisibility As Boolean Dim instance As New DynamicMethod(name, attributes, callingConvention, returnType, parameterTypes, owner, skipVisibility)
public DynamicMethod ( string name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes, Type owner, bool skipVisibility )
public: DynamicMethod ( String^ name, MethodAttributes attributes, CallingConventions callingConvention, Type^ returnType, array<Type^>^ parameterTypes, Type^ owner, bool skipVisibility )
public DynamicMethod ( String name, MethodAttributes attributes, CallingConventions callingConvention, Type returnType, Type[] parameterTypes, Type owner, boolean skipVisibility )
public function DynamicMethod ( name : String, attributes : MethodAttributes, callingConvention : CallingConventions, returnType : Type, parameterTypes : Type[], owner : Type, skipVisibility : boolean )

例外の種類 | 条件 |
---|---|
ArgumentException | parameterTypes の要素が null 参照 (Visual Basic では Nothing) または Void です。 または owner がインターフェイス、配列、オープン ジェネリック型、ジェネリック型またはジェネリック メソッドの型パラメータです。 |
ArgumentNullException | name が null 参照 (Visual Basic では Nothing) です。 または owner が null 参照 (Visual Basic では Nothing) です。 |
NotSupportedException | attributes が Public と Static 以外のフラグの組み合わせです。 または callingConvention が Standard ではありません。 または |

動的メソッドは、owner 型を格納するモジュールに対してグローバルです。動的メソッドは、owner 型のすべてのメンバにアクセスできます。
このコンストラクタで作成した動的メソッドは、owner 型のすべてのメンバ、および owner を格納するモジュールに格納されたすべての型のパブリック メンバと internal (Visual Basic では Friend) メンバにアクセスできます。JIT コンパイラの参照範囲チェックをスキップすると、動的メソッドはモジュール内の他のすべての型のプライベート メンバとプロテクト メンバにもアクセスできるようになります。たとえば、これはオブジェクトをシリアル化するコードを記述する場合に役立ちます。

- ReflectionPermission (コードを出力するために必要なアクセス許可)。ReflectionPermissionFlag.ReflectionEmit (関連する列挙体)
- ReflectionPermission (skipVisibility が true の場合に、JIT の参照範囲チェックをスキップするために必要なアクセス許可)。ReflectionPermissionFlag.MemberAccess (関連する列挙体)
- SecurityPermission (呼び出し元のモジュール以外のモジュールに関連付けられている場合に、証拠を制御するために必要なアクセス許可)。SecurityPermissionFlag.ControlEvidence (関連する列挙体)

Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


DynamicMethod コンストラクタ (String, Type, Type[], Module, Boolean)
アセンブリ: mscorlib (mscorlib.dll 内)

Public Sub New ( _ name As String, _ returnType As Type, _ parameterTypes As Type(), _ m As Module, _ skipVisibility As Boolean _ )
Dim name As String Dim returnType As Type Dim parameterTypes As Type() Dim m As Module Dim skipVisibility As Boolean Dim instance As New DynamicMethod(name, returnType, parameterTypes, m, skipVisibility)
public DynamicMethod ( string name, Type returnType, Type[] parameterTypes, Module m, bool skipVisibility )
public: DynamicMethod ( String^ name, Type^ returnType, array<Type^>^ parameterTypes, Module^ m, bool skipVisibility )
public DynamicMethod ( String name, Type returnType, Type[] parameterTypes, Module m, boolean skipVisibility )
public function DynamicMethod ( name : String, returnType : Type, parameterTypes : Type[], m : Module, skipVisibility : boolean )


このコンストラクタは、メソッド属性に MethodAttributes.Public と MethodAttributes.Static、呼び出し規約に CallingConventions.Standard を指定します。
このコンストラクタで作成した動的メソッドは、格納された m モジュール内のすべての型のパブリック メンバと internal (Visual Basic では Friend) メンバにアクセスできます。JIT コンパイラの参照範囲チェックをスキップすると、動的メソッドはモジュール内のすべての型のプライベート メンバとプロテクト メンバにもアクセスできるようになります。たとえば、これはオブジェクトをシリアル化するコードを記述する場合に役立ちます。

- ReflectionPermission (コードを出力するために必要なアクセス許可)。ReflectionPermissionFlag.ReflectionEmit (関連する列挙体)
- SecurityPermission (呼び出し元のモジュール以外のモジュールに関連付けられている場合に、証拠を制御するために必要なアクセス許可)。SecurityPermissionFlag.ControlEvidence (関連する列挙体)
- ReflectionPermission (skipVisibility が true の場合に、JIT の参照範囲チェックをスキップするために必要なアクセス許可)。ReflectionPermissionFlag.MemberAccess (関連する列挙体)

Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


DynamicMethod コンストラクタ


DynamicMethod コンストラクタ (String, Type, Type[], Module)
アセンブリ: mscorlib (mscorlib.dll 内)

Public Sub New ( _ name As String, _ returnType As Type, _ parameterTypes As Type(), _ m As Module _ )
Dim name As String Dim returnType As Type Dim parameterTypes As Type() Dim m As Module Dim instance As New DynamicMethod(name, returnType, parameterTypes, m)
public function DynamicMethod ( name : String, returnType : Type, parameterTypes : Type[], m : Module )


このコンストラクタは、メソッド属性に MethodAttributes.Public と MethodAttributes.Static、呼び出し規約に CallingConventions.Standard を指定し、JIT (Just-In-Time) の参照範囲チェックをスキップしません。
このコンストラクタで作成した動的メソッドは、m モジュールに格納されたすべての型のパブリック メンバと internal (Visual Basic では Friend) メンバにアクセスできます。

2 つのパラメータを使用する動的メソッドを作成するコード例を次に示します。この例では、コンソールに 1 つ目のパラメータを出力する簡単な関数本体を出力し、2 つ目のパラメータをメソッドの戻り値として使用しています。この例では、デリゲートを作成することによってメソッドを完了し、さまざまなパラメータを持つデリゲートを呼び出し、最後に Invoke(Object,BindingFlags,Binder,Object[],CultureInfo) メソッドを使用して動的メソッドを呼び出します。
Imports System Imports System.Reflection Imports System.Reflection.Emit Imports Microsoft.VisualBasic Public Class Test ' Declare a delegate that will be used to execute the completed ' dynamic method. Private Delegate Function HelloInvoker(ByVal msg As String, _ ByVal ret As Integer) As Integer Public Shared Sub Main() ' Create an array that specifies the types of the parameters ' of the dynamic method. This method has a String parameter ' and an Integer parameter. Dim helloArgs() As Type = {GetType(String), GetType(Integer)} ' Create a dynamic method with the name "Hello", a return type ' of Integer, and two parameters whose types are specified by ' the array helloArgs. Create the method in the module that ' defines the Test class. Dim hello As New DynamicMethod("Hello", _ GetType(Integer), _ helloArgs, _ GetType(Test).Module) ' Create an array that specifies the parameter types of the ' overload of Console.WriteLine to be used in Hello. Dim writeStringArgs() As Type = {GetType(String)} ' Get the overload of Console.WriteLine that has one ' String parameter. Dim writeString As MethodInfo = GetType(Console). _ GetMethod("WriteLine", writeStringArgs) ' Get an ILGenerator and emit a body for the dynamic method. Dim il As ILGenerator = hello.GetILGenerator() ' Load the first argument, which is a string, onto the stack. il.Emit(OpCodes.Ldarg_0) ' Call the overload of Console.WriteLine that prints a string. il.EmitCall(OpCodes.Call, writeString, Nothing) ' The Hello method returns the value of the second argument; ' to do this, load the onto the stack and return. il.Emit(OpCodes.Ldarg_1) il.Emit(OpCodes.Ret) ' Create a delegate that represents the dynamic method. This ' action completes the method, and any further attempts to ' change the method will cause an exception. Dim hi As HelloInvoker = _ hello.CreateDelegate(GetType(HelloInvoker)) ' Use the delegate to execute the dynamic method. Save and ' print the return value. Dim retval As Integer = hi(vbCrLf & "Hello, World!", 42) Console.WriteLine("Executing delegate hi(""Hello, World!"", 42) returned " _ & retval) ' Do it again, with different arguments. retval = hi(vbCrLf & "Hi, Mom!", 5280) Console.WriteLine("Executing delegate hi(""Hi, Mom!"", 5280) returned " _ & retval) ' Create an array of arguments to use with the Invoke method. Dim invokeArgs() As Object = {vbCrLf & "Hello, World!", 42} ' Invoke the dynamic method using the arguments. This is much ' slower than using the delegate, because you must create an ' array to contain the arguments, and ValueType arguments ' must be boxed. Note that this overload of Invoke is ' inherited from MethodBase, and simply calls the more ' complete overload of Invoke. Dim objRet As Object = hello.Invoke(Nothing, invokeArgs) Console.WriteLine("hello.Invoke returned " & objRet) End Sub End Class ' This code example produces the following output: ' 'Hello, World! 'Executing delegate hi("Hello, World!", 42) returned 42 ' 'Hi, Mom! 'Executing delegate hi("Hi, Mom!", 5280) returned 5280 ' 'Hello, World! 'hello.Invoke returned 42 '
using System; using System.Reflection; using System.Reflection.Emit; using Microsoft.VisualBasic; public class Test { // Declare a delegate that will be used to execute the completed // dynamic method. private delegate int HelloInvoker(string msg, int ret); public static void Main() { // Create an array that specifies the types of the parameters // of the dynamic method. This method has a string parameter // and an int parameter. Type[] helloArgs = {typeof(string), typeof(int)}; // Create a dynamic method with the name "Hello", a return type // of int, and two parameters whose types are specified by the // array helloArgs. Create the method in the module that // defines the Test class. DynamicMethod hello = new DynamicMethod("Hello", typeof(int), helloArgs, typeof(Test).Module); // Create an array that specifies the parameter types of the // overload of Console.WriteLine to be used in Hello. Type[] writeStringArgs = {typeof(string)}; // Get the overload of Console.WriteLine that has one // String parameter. MethodInfo writeString = typeof(Console).GetMethod("WriteLine", writeStringArgs); // Get an ILGenerator and emit a body for the dynamic method. ILGenerator il = hello.GetILGenerator(); // Load the first argument, which is a string, onto the stack. il.Emit(OpCodes.Ldarg_0); // Call the overload of Console.WriteLine that prints a string. il.EmitCall(OpCodes.Call, writeString, null); // The Hello method returns the value of the second argument; // to do this, load the onto the stack and return. il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ret); // Create a delegate that represents the dynamic method. This // action completes the method, and any further attempts to // change the method will cause an exception. HelloInvoker hi = (HelloInvoker) hello.CreateDelegate(typeof(HelloInvoker)); // Use the delegate to execute the dynamic method. Save and // print the return value. int retval = hi("\r\nHello, World!", 42); Console.WriteLine("Executing delegate hi(\"Hello, World!\", 42) returned {0}", retval); // Do it again, with different arguments. retval = hi("\r\nHi, Mom!", 5280); Console.WriteLine("Executing delegate hi(\"Hi, Mom!\", 5280) returned {0}", retval); // Create an array of arguments to use with the Invoke method. object[] invokeArgs = {"\r\nHello, World!", 42}; // Invoke the dynamic method using the arguments. This is much // slower than using the delegate, because you must create an // array to contain the arguments, and ValueType arguments // must be boxed. object objRet = hello.Invoke(null, invokeArgs); Console.WriteLine("hello.Invoke returned {0}", objRet); } }
using namespace System; using namespace System::Reflection; using namespace System::Reflection::Emit; public ref class Test { }; // Declare a delegate that will be used to execute the completed // dynamic method. delegate int HelloInvoker(String^ msg, int ret); int main() { // Create an array that specifies the types of the parameters // of the dynamic method. This method has a string parameter // and an int parameter. array<Type^>^ helloArgs = {String::typeid, int::typeid}; // Create a dynamic method with the name "Hello", a return type // of int, and two parameters whose types are specified by the // array helloArgs. Create the method in the module that // defines the Test class. DynamicMethod^ hello = gcnew DynamicMethod("Hello", int::typeid, helloArgs, Test::typeid->Module); // Create an array that specifies the parameter types of the // overload of Console.WriteLine to be used in Hello. array<Type^>^ writeStringArgs = {String::typeid}; // Get the overload of Console.WriteLine that has one // String parameter. MethodInfo^ writeString = Console::typeid->GetMethod("WriteLine", writeStringArgs); // Get an ILGenerator and emit a body for the dynamic method. ILGenerator^ ilgen = hello->GetILGenerator(); // Load the first argument, which is a string, onto the stack. ilgen->Emit(OpCodes::Ldarg_0); // Call the overload of Console.WriteLine that prints a string. ilgen->EmitCall(OpCodes::Call, writeString, nullptr); // The Hello method returns the value of the second argument; // to do this, load the onto the stack and return. ilgen->Emit(OpCodes::Ldarg_1); ilgen->Emit(OpCodes::Ret); // Create a delegate that represents the dynamic method. This // action completes the method, and any further attempts to // change the method will cause an exception. HelloInvoker^ helloDelegate = (HelloInvoker^) hello->CreateDelegate(HelloInvoker::typeid); // Use the delegate to execute the dynamic method. Save and // print the return value. int returnValue = helloDelegate("\r\nHello, World!", 42); Console::WriteLine("helloDelegate(\"Hello, World!\", 42) returned {0}", returnValue); // Do it again, with different arguments. returnValue = helloDelegate("\r\nHi, Mom!", 5280); Console::WriteLine("helloDelegate(\"Hi, Mom!\", 5280) returned {0}", returnValue); // Create an array of arguments to use with the Invoke method. array<Object^>^ delegateArgs = {"\r\nHello, World!", 42}; // Invoke the dynamic method using the arguments. This is much // slower than using the delegate, because you must create an // array to contain the arguments, and ValueType arguments // must be boxed. Object^ returnValueObject = hello->Invoke(nullptr, delegateArgs); Console::WriteLine("hello.Invoke returned {0}", returnValueObject); }
import System.*; import System.Reflection.*; import System.Reflection.Emit.*; import Microsoft.VisualBasic.*; public class Test { /** @delegate */ // Declare a delegate that will be used to execute the completed // dynamic method. private delegate int HelloInvoker(String msg, int ret); public static void main(String[] args) { // Create an array that specifies the types of the parameters // of the dynamic method. This method has a string parameter // and an int parameter. Type helloArgs[] = { String.class.ToType(), int.class.ToType() }; // Create a dynamic method with the name "Hello", a return type // of int, and two parameters whose types are specified by the // array helloArgs. Create the method in the module that // defines the Test class. DynamicMethod hello = new DynamicMethod("Hello", int.class.ToType(), helloArgs, Test.class.ToType().get_Module()); // Create an array that specifies the parameter types of the // overload of Console.WriteLine to be used in Hello. Type writeStringArgs[] = { String.class.ToType() }; // Get the overload of Console.WriteLine that has one // String parameter. MethodInfo writeString = Console.class.ToType().GetMethod("WriteLine" , writeStringArgs); // Get an ILGenerator and emit a body for the dynamic method. ILGenerator il = hello.GetILGenerator(); // Load the first argument, which is a string, onto the stack. il.Emit(OpCodes.Ldarg_0); // Call the overload of Console.WriteLine that prints a string. il.EmitCall(OpCodes.Call, writeString, null); // The Hello method returns the value of the second argument; // to do this, load the onto the stack and return. il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ret); // Create a delegate that represents the dynamic method. This // action completes the method, and any further attempts to // change the method will cause an exception. HelloInvoker hi = (HelloInvoker)(hello.CreateDelegate( HelloInvoker.class.ToType())); // Use the delegate to execute the dynamic method. Save and // print the return value. int retval = hi.Invoke("\r\nHello, World!", 42); Console.WriteLine("Invoking delegate hi(\"Hello, World!\", 42) returned {0}", System.Convert.ToString(retval)); // Do it again, with different arguments. retval = hi.Invoke("\r\nHi, Mom!", 5280); Console.WriteLine("Invoking delegate hi(\"Hi, Mom!\", 5280) returned {0}", System.Convert.ToString(retval)); // Create an array of arguments to use with the Invoke method. Object invokeArgs[] = { "\r\nHello, World!", (System.Int32)42 }; // Invoke the dynamic method using the arguments. This is much // slower than using the delegate, because you must create an // array to contain the arguments, and ValueType arguments // must be boxed. Object objRet = hello.Invoke(null, invokeArgs); Console.WriteLine("hello.Invoke returned {0}", objRet); } //main } //Test


Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


DynamicMethod コンストラクタ (String, Type, Type[], Type, Boolean)
アセンブリ: mscorlib (mscorlib.dll 内)

Public Sub New ( _ name As String, _ returnType As Type, _ parameterTypes As Type(), _ owner As Type, _ skipVisibility As Boolean _ )
Dim name As String Dim returnType As Type Dim parameterTypes As Type() Dim owner As Type Dim skipVisibility As Boolean Dim instance As New DynamicMethod(name, returnType, parameterTypes, owner, skipVisibility)
public DynamicMethod ( string name, Type returnType, Type[] parameterTypes, Type owner, bool skipVisibility )
public: DynamicMethod ( String^ name, Type^ returnType, array<Type^>^ parameterTypes, Type^ owner, bool skipVisibility )
public DynamicMethod ( String name, Type returnType, Type[] parameterTypes, Type owner, boolean skipVisibility )
public function DynamicMethod ( name : String, returnType : Type, parameterTypes : Type[], owner : Type, skipVisibility : boolean )

例外の種類 | 条件 |
---|---|
ArgumentException | parameterTypes の要素が null 参照 (Visual Basic では Nothing) または Void です。 または owner がインターフェイス、配列、オープン ジェネリック型のいずれか、あるいはジェネリック型またはジェネリック メソッドの型パラメータです。 |
ArgumentNullException | name が null 参照 (Visual Basic では Nothing) です。 または owner が null 参照 (Visual Basic では Nothing) です。 |
NotSupportedException | returnType が null 参照 (Visual Basic では Nothing) であるか、IsByRef で true が返される型です。 |

このコンストラクタで作成した動的メソッドは、owner 型のすべてのメンバ、および owner を格納するモジュール内の他のすべての型のパブリック メンバと internal (Visual Basic では Friend) メンバにアクセスできます。JIT コンパイラの参照範囲チェックをスキップすると、動的メソッドはモジュール内の他のすべての型のプライベート メンバとプロテクト メンバにもアクセスできるようになります。たとえば、これはオブジェクトをシリアル化するコードを記述する場合に役立ちます。
このコンストラクタは、メソッド属性に MethodAttributes.Public と MethodAttributes.Static、呼び出し規約に CallingConventions.Standard を指定します。

- ReflectionPermission (コードを出力するために必要なアクセス許可)。ReflectionPermissionFlag.ReflectionEmit (関連する列挙体)
- SecurityPermission (呼び出し元のモジュール以外のモジュールに関連付けられている場合に、証拠を制御するために必要なアクセス許可)。SecurityPermissionFlag.ControlEvidence (関連する列挙体)
- ReflectionPermission (skipVisibility が true の場合に、JIT の参照範囲チェックをスキップするために必要なアクセス許可)。ReflectionPermissionFlag.MemberAccess (関連する列挙体)

Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


DynamicMethod コンストラクタ (String, Type, Type[], Type)
アセンブリ: mscorlib (mscorlib.dll 内)

Public Sub New ( _ name As String, _ returnType As Type, _ parameterTypes As Type(), _ owner As Type _ )
Dim name As String Dim returnType As Type Dim parameterTypes As Type() Dim owner As Type Dim instance As New DynamicMethod(name, returnType, parameterTypes, owner)
public function DynamicMethod ( name : String, returnType : Type, parameterTypes : Type[], owner : Type )

例外の種類 | 条件 |
---|---|
ArgumentException | parameterTypes の要素が null 参照 (Visual Basic では Nothing) または Void です。 または owner がインターフェイス、配列、オープン ジェネリック型のいずれか、あるいはジェネリック型またはジェネリック メソッドの型パラメータです。 |
ArgumentNullException | name が null 参照 (Visual Basic では Nothing) です。 または owner が null 参照 (Visual Basic では Nothing) です。 |
NotSupportedException | returnType が null 参照 (Visual Basic では Nothing) であるか、IsByRef で true が返される型です。 |

このコンストラクタで作成した動的メソッドは、owner 型のすべてのメンバ、および owner を格納するモジュール内の他のすべての型のパブリック メンバと internal (Visual Basic では Friend) メンバにアクセスできます。
このコンストラクタは、メソッド属性に MethodAttributes.Public と MethodAttributes.Static、呼び出し規約に CallingConventions.Standard を指定し、JIT (Just-In-Time) の参照範囲チェックをスキップしません。

型に論理的に関連付けられた DynamicMethod を作成し、その型のプライベート メンバにアクセスできるようにするコード例を次に示します。
このコード例では、プライベート フィールドを持つ Example という名前のクラス、この最初のクラスから派生した DerivedFromxample という名前のクラス、Int32 を返し、Example 型と Int32 型のパラメータを持つ UseLikeStatic というデリゲート型、および Int32 を返し、Int32 型のパラメータを 1 つ持つ UseLikeInstance という名前のデリゲート型を定義します。
次に、Example のインスタンスのプライベート フィールドを変更し、以前の値を返す DynamicMethod を作成します。
![]() |
---|
この例のコードでは、Example のインスタンスを作成した後、2 つのデリゲートを作成しています。1 つ目は、動的メソッドと同じパラメータを持つ UseLikeStatic 型のデリゲートです。2 つ目は、1 つ目のパラメータ (Example 型) のない UseLikeInstance 型のデリゲートです。このデリゲートは、CreateDelegate(Type,Object) メソッド オーバーロードを使用して作成されます。このメソッド オーバーロードの 2 つ目のパラメータは Example のインスタンスです。この場合、インスタンスを作成するだけで新しく作成されたデリゲートにバインドされます。このデリゲートを呼び出すたびに、動的メソッドは Example のバインドされたインスタンスに対して機能します。
![]() |
---|
これは、System.Delegate.CreateDelegate メソッドの新しいオーバーロードと共に、.NET Framework Version 2.0 に導入されたデリゲート バインディングの緩やかな規則の一例です。詳細については、Delegate クラスのトピックを参照してください。 |
UseLikeStatic デリゲートが呼び出され、UseLikeInstance デリゲートにバインドされた Example のインスタンスが渡されます。次に、UseLikeInstance デリゲートが呼び出され、この 2 つのデリゲートが Example の同じインスタンスに対して機能します。内部フィールドの値の変更は、各呼び出しの後に表示されます。最後に、UseLikeInstance デリゲートが DerivedFromxample のインスタンスにバインドされ、デリゲートの呼び出しが繰り返されます。
Imports System Imports System.Reflection Imports System.Reflection.Emit ' These classes are for demonstration purposes. ' Public Class Example Private _id As Integer = 0 Public Sub New(ByVal newId As Integer) _id = newId End Sub Public ReadOnly Property ID() As Integer Get Return _id End Get End Property End Class Public Class DerivedFromExample Inherits Example Public Sub New(ByVal newId As Integer) MyBase.New(newId) End Sub End Class ' Two delegates are declared: UseLikeInstance treats the dynamic ' method as if it were an instance method, and UseLikeStatic ' treats the dynamic method in the ordinary fashion. ' Public Delegate Function UseLikeInstance(ByVal newID As Integer) _ As Integer Public Delegate Function UseLikeStatic(ByVal ex As Example, _ ByVal newID As Integer) As Integer Public Class Demo Public Shared Sub Main() ' This dynamic method changes the private _id field. It ' has no name; it returns the old _id value (return type ' Integer); it takes two parameters, an instance of Example ' and an Integer that is the new value of _id; and it is ' declared with Example as the owner type, so it can ' access all members, public and private. ' Dim changeID As New DynamicMethod( _ "", _ GetType(Integer), _ New Type() {GetType(Example), GetType(Integer)}, _ GetType(Example) _ ) ' Get a FieldInfo for the private field '_id'. Dim fid As FieldInfo = GetType(Example).GetField( _ "_id", _ BindingFlags.NonPublic Or BindingFlags.Instance _ ) Dim ilg As ILGenerator = changeID.GetILGenerator() ' Push the current value of the id field onto the ' evaluation stack. It's an instance field, so load the ' instance of Example before accessing the field. ilg.Emit(OpCodes.Ldarg_0) ilg.Emit(OpCodes.Ldfld, fid) ' Load the instance of Example again, load the new value ' of id, and store the new field value. ilg.Emit(OpCodes.Ldarg_0) ilg.Emit(OpCodes.Ldarg_1) ilg.Emit(OpCodes.Stfld, fid) ' The original value of the id field is now the only ' thing on the stack, so return from the call. ilg.Emit(OpCodes.Ret) ' Create a delegate that uses changeID in the ordinary ' way, as a static method that takes an instance of ' Example and an Integer. ' Dim uls As UseLikeStatic = CType( _ changeID.CreateDelegate(GetType(UseLikeStatic)), _ UseLikeStatic _ ) ' Create an instance of Example with an id of 42. ' Dim ex As New Example(42) ' Create a delegate that is bound to the instance of ' of Example. This is possible because the first ' parameter of changeID is of type Example. The ' delegate has all the parameters of changeID except ' the first. Dim uli As UseLikeInstance = CType( _ changeID.CreateDelegate( _ GetType(UseLikeInstance), _ ex), _ UseLikeInstance _ ) ' First, change the value of _id by calling changeID as ' a static method, passing in the instance of Example. ' Console.WriteLine( _ "Change the value of _id; previous value: {0}", _ uls(ex, 1492) _ ) ' Change the value of _id again using the delegate ' bound to the instance of Example. ' Console.WriteLine( _ "Change the value of _id; previous value: {0}", _ uli(2700) _ ) Console.WriteLine("Final value of _id: {0}", ex.ID) ' Now repeat the process with a class that derives ' from Example. ' Dim dfex As New DerivedFromExample(71) uli = CType( _ changeID.CreateDelegate( _ GetType(UseLikeInstance), _ dfex), _ UseLikeInstance _ ) Console.WriteLine( _ "Change the value of _id; previous value: {0}", _ uls(dfex, 73) _ ) Console.WriteLine( _ "Change the value of _id; previous value: {0}", _ uli(79) _ ) Console.WriteLine("Final value of _id: {0}", dfex.ID) End Sub End Class ' This code example produces the following output: ' 'Change the value of _id; previous value: 42 'Change the value of _id; previous value: 1492 'Final value of _id: 2700 'Change the value of _id; previous value: 71 'Change the value of _id; previous value: 73 'Final value of _id: 79'
using System; using System.Reflection; using System.Reflection.Emit; // These classes are for demonstration purposes. // public class Example { private int id = 0; public Example(int id) { this.id = id; } public int ID { get { return id; }} } public class DerivedFromExample : Example { public DerivedFromExample(int id) : base(id) {} } // Two delegates are declared: UseLikeInstance treats the dynamic // method as if it were an instance method, and UseLikeStatic // treats the dynamic method in the ordinary fashion. // public delegate int UseLikeInstance(int newID); public delegate int UseLikeStatic(Example ex, int newID); public class Demo { public static void Main() { // This dynamic method changes the private id field. It has // no name; it returns the old id value (return type int); // it takes two parameters, an instance of Example and // an int that is the new value of id; and it is declared // with Example as the owner type, so it can access all // members, public and private. // DynamicMethod changeID = new DynamicMethod( "", typeof(int), new Type[] { typeof(Example), typeof(int) }, typeof(Example) ); // Get a FieldInfo for the private field 'id'. FieldInfo fid = typeof(Example).GetField( "id", BindingFlags.NonPublic | BindingFlags.Instance ); ILGenerator ilg = changeID.GetILGenerator(); // Push the current value of the id field onto the // evaluation stack. It's an instance field, so load the // instance of Example before accessing the field. ilg.Emit(OpCodes.Ldarg_0); ilg.Emit(OpCodes.Ldfld, fid); // Load the instance of Example again, load the new value // of id, and store the new field value. ilg.Emit(OpCodes.Ldarg_0); ilg.Emit(OpCodes.Ldarg_1); ilg.Emit(OpCodes.Stfld, fid); // The original value of the id field is now the only // thing on the stack, so return from the call. ilg.Emit(OpCodes.Ret); // Create a delegate that uses changeID in the ordinary // way, as a static method that takes an instance of // Example and an int. // UseLikeStatic uls = (UseLikeStatic) changeID.CreateDelegate( typeof(UseLikeStatic) ); // Create an instance of Example with an id of 42. // Example ex = new Example(42); // Create a delegate that is bound to the instance of // of Example. This is possible because the first // parameter of changeID is of type Example. The // delegate has all the parameters of changeID except // the first. UseLikeInstance uli = (UseLikeInstance) changeID.CreateDelegate( typeof(UseLikeInstance), ex ); // First, change the value of id by calling changeID as // a static method, passing in the instance of Example. // Console.WriteLine( "Change the value of id; previous value: {0}", uls(ex, 1492) ); // Change the value of id again using the delegate bound // to the instance of Example. // Console.WriteLine( "Change the value of id; previous value: {0}", uli(2700) ); Console.WriteLine("Final value of id: {0}", ex.ID); // Now repeat the process with a class that derives // from Example. // DerivedFromExample dfex = new DerivedFromExample(71); uli = (UseLikeInstance) changeID.CreateDelegate( typeof(UseLikeInstance), dfex ); Console.WriteLine( "Change the value of id; previous value: {0}", uls(dfex, 73) ); Console.WriteLine( "Change the value of id; previous value: {0}", uli(79) ); Console.WriteLine("Final value of id: {0}", dfex.ID); } } /* This code example produces the following output: Change the value of id; previous value: 42 Change the value of id; previous value: 1492 Final value of id: 2700 Change the value of id; previous value: 71 Change the value of id; previous value: 73 Final value of id: 79 */


Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


DynamicMethod プロパティ

名前 | 説明 | |
---|---|---|
![]() | Attributes | オーバーライドされます。 動的メソッドの作成時に指定した属性を取得します。 |
![]() | CallingConvention | オーバーライドされます。 動的メソッドの作成時に指定した呼び出し規約を取得します。 |
![]() | ContainsGenericParameters | ジェネリック メソッドに未割り当てのジェネリック型パラメータが含まれているかどうかを示す値を取得します。 ( MethodInfo から継承されます。) |
![]() | DeclaringType | オーバーライドされます。 動的メソッドに対して常に null 参照 (Visual Basic では Nothing) である、メソッドを宣言する型を取得します。 |
![]() | InitLocals | メソッドのローカル変数を 0 で初期化するかどうかを示す値を取得または設定します。 |
![]() | IsAbstract | メソッドが抽象メソッドかどうかを示す値を取得します。 ( MethodBase から継承されます。) |
![]() | IsAssembly | 同じアセンブリの異なるクラスからこのメソッドを呼び出すことができるかどうかを示す値を取得します。 ( MethodBase から継承されます。) |
![]() | IsConstructor | メソッドがコンストラクタかどうかを示す値を取得します。 ( MethodBase から継承されます。) |
![]() | IsFamily | このメソッドへのアクセスがクラスのメンバと派生クラスのメンバに制限されているかどうかを示す値を取得します。 ( MethodBase から継承されます。) |
![]() | IsFamilyAndAssembly | 同じアセンブリの派生クラスからこのメソッドを呼び出すことができるかどうかを示す値を取得します。 ( MethodBase から継承されます。) |
![]() | IsFamilyOrAssembly | すべての派生クラスおよび同じアセンブリのすべてのクラスからこのメソッドを呼び出すことができるかどうかを示す値を取得します。 ( MethodBase から継承されます。) |
![]() | IsFinal | このメソッドが final かどうかを示す値を取得します。 ( MethodBase から継承されます。) |
![]() | IsGenericMethod | 現在のメソッドがジェネリック メソッドかどうかを示す値を取得します。 ( MethodInfo から継承されます。) |
![]() | IsGenericMethodDefinition | 現在の MethodInfo がジェネリック メソッドの定義を表しているかどうかを示す値を取得します。 ( MethodInfo から継承されます。) |
![]() | IsHideBySig | 派生クラスで、正確に同じシグネチャを持つ同じ種類のメンバだけが隠しメンバになるかどうかを示す値を取得します。 ( MethodBase から継承されます。) |
![]() | IsPrivate | このメンバがプライベートかどうかを示す値を取得します。 ( MethodBase から継承されます。) |
![]() | IsPublic | パブリック メソッドかどうかを示す値を取得します。 ( MethodBase から継承されます。) |
![]() | IsSpecialName | 特別な名前のメソッドかどうかを示す値を取得します。 ( MethodBase から継承されます。) |
![]() | IsStatic | メソッドが static かどうかを示す値を取得します。 ( MethodBase から継承されます。) |
![]() | IsVirtual | メソッドが virtual かどうかを示す値を取得します。 ( MethodBase から継承されます。) |
![]() | MemberType | このメンバがメソッドであることを示す MemberTypes 値を取得します。 ( MethodInfo から継承されます。) |
![]() | MetadataToken | メタデータ要素を識別する値を取得します。 ( MemberInfo から継承されます。) |
![]() | MethodHandle | オーバーライドされます。 動的メソッドではサポートされていません。 |
![]() | Module | オーバーライドされます。 動的メソッドを論理的に関連付けるモジュールを取得します。 |
![]() | Name | オーバーライドされます。 動的メソッドの名前を取得します。 |
![]() | ReflectedType | オーバーライドされます。 メソッドを取得するためにリフレクションで使用したクラスを取得します。 |
![]() | ReturnParameter | オーバーライドされます。 動的メソッドの返されるパラメータを取得します。 |
![]() | ReturnType | オーバーライドされます。 動的メソッドの戻り値の型を取得します。 |
![]() | ReturnTypeCustomAttributes | オーバーライドされます。 動的メソッドの戻り値の型のカスタム属性を取得します。 |

DynamicMethod メソッド


DynamicMethod メンバ
動的メソッドを定義および表現します。このクラスは継承できません。
DynamicMethod データ型で公開されるメンバを以下の表に示します。


名前 | 説明 | |
---|---|---|
![]() | Attributes | オーバーライドされます。 動的メソッドの作成時に指定した属性を取得します。 |
![]() | CallingConvention | オーバーライドされます。 動的メソッドの作成時に指定した呼び出し規約を取得します。 |
![]() | ContainsGenericParameters | ジェネリック メソッドに未割り当てのジェネリック型パラメータが含まれているかどうかを示す値を取得します。(MethodInfo から継承されます。) |
![]() | DeclaringType | オーバーライドされます。 動的メソッドに対して常に null 参照 (Visual Basic では Nothing) である、メソッドを宣言する型を取得します。 |
![]() | InitLocals | メソッドのローカル変数を 0 で初期化するかどうかを示す値を取得または設定します。 |
![]() | IsAbstract | メソッドが抽象メソッドかどうかを示す値を取得します。(MethodBase から継承されます。) |
![]() | IsAssembly | 同じアセンブリの異なるクラスからこのメソッドを呼び出すことができるかどうかを示す値を取得します。(MethodBase から継承されます。) |
![]() | IsConstructor | メソッドがコンストラクタかどうかを示す値を取得します。(MethodBase から継承されます。) |
![]() | IsFamily | このメソッドへのアクセスがクラスのメンバと派生クラスのメンバに制限されているかどうかを示す値を取得します。(MethodBase から継承されます。) |
![]() | IsFamilyAndAssembly | 同じアセンブリの派生クラスからこのメソッドを呼び出すことができるかどうかを示す値を取得します。(MethodBase から継承されます。) |
![]() | IsFamilyOrAssembly | すべての派生クラスおよび同じアセンブリのすべてのクラスからこのメソッドを呼び出すことができるかどうかを示す値を取得します。(MethodBase から継承されます。) |
![]() | IsFinal | このメソッドが final かどうかを示す値を取得します。(MethodBase から継承されます。) |
![]() | IsGenericMethod | 現在のメソッドがジェネリック メソッドかどうかを示す値を取得します。(MethodInfo から継承されます。) |
![]() | IsGenericMethodDefinition | 現在の MethodInfo がジェネリック メソッドの定義を表しているかどうかを示す値を取得します。(MethodInfo から継承されます。) |
![]() | IsHideBySig | 派生クラスで、正確に同じシグネチャを持つ同じ種類のメンバだけが隠しメンバになるかどうかを示す値を取得します。(MethodBase から継承されます。) |
![]() | IsPrivate | このメンバがプライベートかどうかを示す値を取得します。(MethodBase から継承されます。) |
![]() | IsPublic | パブリック メソッドかどうかを示す値を取得します。(MethodBase から継承されます。) |
![]() | IsSpecialName | 特別な名前のメソッドかどうかを示す値を取得します。(MethodBase から継承されます。) |
![]() | IsStatic | メソッドが static かどうかを示す値を取得します。(MethodBase から継承されます。) |
![]() | IsVirtual | メソッドが virtual かどうかを示す値を取得します。(MethodBase から継承されます。) |
![]() | MemberType | このメンバがメソッドであることを示す MemberTypes 値を取得します。(MethodInfo から継承されます。) |
![]() | MetadataToken | メタデータ要素を識別する値を取得します。(MemberInfo から継承されます。) |
![]() | MethodHandle | オーバーライドされます。 動的メソッドではサポートされていません。 |
![]() | Module | オーバーライドされます。 動的メソッドを論理的に関連付けるモジュールを取得します。 |
![]() | Name | オーバーライドされます。 動的メソッドの名前を取得します。 |
![]() | ReflectedType | オーバーライドされます。 メソッドを取得するためにリフレクションで使用したクラスを取得します。 |
![]() | ReturnParameter | オーバーライドされます。 動的メソッドの返されるパラメータを取得します。 |
![]() | ReturnType | オーバーライドされます。 動的メソッドの戻り値の型を取得します。 |
![]() | ReturnTypeCustomAttributes | オーバーライドされます。 動的メソッドの戻り値の型のカスタム属性を取得します。 |


- DynamicMethodのページへのリンク