次の方法で共有


MethodBuilder クラス

動的クラスのメソッド (またはコンストラクタ) を定義および表現します。

この型のすべてのメンバの一覧については、MethodBuilder メンバ を参照してください。

System.Object
   System.Reflection.MemberInfo
      System.Reflection.MethodBase
         System.Reflection.MethodInfo
            System.Reflection.Emit.MethodBuilder

NotInheritable Public Class MethodBuilder
   Inherits MethodInfo
[C#]
public sealed class MethodBuilder : MethodInfo
[C++]
public __gc __sealed class MethodBuilder : public MethodInfo
[JScript]
public class MethodBuilder extends MethodInfo

スレッドセーフ

Reflection Emit は、Boolean パラメータ isSynchronizedtrue に設定して呼び出した AppDomain.DefineDynamicAssembly メソッドで作成されたアセンブリを使用する場合は、スレッド セーフです。

解説

MethodBuilder を使用して、MSIL (Microsoft Intermediate Language) のメソッドを完全に記述します。名前、属性、シグネチャ、メソッド本体が含まれます。 TypeBuilder クラスと組み合わせて使用され、実行時にクラスを作成します。

使用例

[Visual Basic, C#, C++] MethodBuilder クラスを使用して、動的な型の中にメソッドを作成する方法を次の例に示します。

 
Imports System
Imports System.Threading
Imports System.Reflection
Imports System.Reflection.Emit

 _


Class DemoMethodBuilder
   
   Public Shared Sub AddMethodDynamically(ByRef myTypeBld As TypeBuilder, _
                        mthdName As String, _
                            mthdParams() As Type, _
                            returnType As Type, _
                            mthdAction As String)
      
      Dim myMthdBld As MethodBuilder = myTypeBld.DefineMethod(mthdName, _
                       MethodAttributes.Public Or MethodAttributes.Static, _
                       returnType, _
                       mthdParams)
      
      Dim ILout As ILGenerator = myMthdBld.GetILGenerator()
      
      Dim numParams As Integer = mthdParams.Length
      
      Dim x As Byte
      For x = 0 To numParams - 1
         ILout.Emit(OpCodes.Ldarg_S, x)
      Next x
      
      If numParams > 1 Then
         Dim y As Integer
         For y = 0 To (numParams - 1) - 1
            Select Case mthdAction
               Case "A"
                  ILout.Emit(OpCodes.Add)
               Case "M"
                  ILout.Emit(OpCodes.Mul)
               Case Else
                  ILout.Emit(OpCodes.Add)
            End Select
         Next y
      End If
      ILout.Emit(OpCodes.Ret)
   End Sub 'AddMethodDynamically
    
   
   Public Shared Sub Main()
      
      Dim myDomain As AppDomain = Thread.GetDomain()
      Dim asmName As New AssemblyName()
      asmName.Name = "DynamicAssembly1"
      
      Dim myAsmBuilder As AssemblyBuilder = myDomain.DefineDynamicAssembly(asmName, _
                        AssemblyBuilderAccess.RunAndSave)
      
      Dim myModule As ModuleBuilder = myAsmBuilder.DefineDynamicModule("DynamicModule1", _
                                       "MyDynamicAsm.dll")
      
      Dim myTypeBld As TypeBuilder = myModule.DefineType("MyDynamicType", TypeAttributes.Public)
      
      ' Get info from the user to build the method dynamically.
      Console.WriteLine("Let's build a simple method dynamically!")
      Console.WriteLine("Please enter a few numbers, separated by spaces.")
      Dim inputNums As String = Console.ReadLine()
      Console.Write("Do you want to [A]dd or [M]ultiply these numbers? ")
      Dim myMthdAction As String = Console.ReadLine()
      Console.Write("Lastly, what do you want to name your new dynamic method? ")
      Dim myMthdName As String = Console.ReadLine()
      
      ' Process inputNums into an array and create a corresponding Type array 
      Dim index As Integer = 0
      Dim inputNumsList As String() = inputNums.Split()
      
      Dim myMthdParams(inputNumsList.Length - 1) As Type
      Dim inputValsList(inputNumsList.Length - 1) As Object
      
      
      Dim inputNum As String
      For Each inputNum In  inputNumsList
         inputValsList(index) = CType(Convert.ToInt32(inputNum), Object)
         myMthdParams(index) = GetType(Integer)
         index += 1
      Next inputNum
      
      ' Now, call the method building method with the parameters, passing the 
      ' TypeBuilder by reference.
      AddMethodDynamically(myTypeBld, myMthdName, myMthdParams, GetType(Integer), myMthdAction)
      
      Dim myType As Type = myTypeBld.CreateType()
     
      Dim description as String 
      If myMthdAction = "A" Then
     description = "adding"
      Else
     description = "multiplying"
      End If

      Console.WriteLine("---")
      Console.WriteLine("The result of {0} the inputted values is: {1}", _
             description, _
                 myType.InvokeMember(myMthdName, _
                         BindingFlags.InvokeMethod Or _
                                 BindingFlags.Public Or _
                         BindingFlags.Static, _
                         Nothing, _
                         Nothing, _
                         inputValsList)) 
      Console.WriteLine("---")

      ' If you are interested in seeing the MSIL generated dynamically for the method
      ' your program generated, change to the directory where you ran the compiled
      ' code sample and type "ildasm MyDynamicAsm.dll" at the prompt. When the list
      ' of manifest contents appears, click on "MyDynamicType" and then on the name of
      ' of the method you provided during execution.
 
      myAsmBuilder.Save("MyDynamicAsm.dll") 

      Dim myMthdInfo As MethodInfo = myType.GetMethod(myMthdName)
      Console.WriteLine("Your Dynamic Method: {0};", myMthdInfo.ToString())
   End Sub 'Main 
End Class 'DemoMethodBuilder


[C#] 

using System;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;


class DemoMethodBuilder {

    public static void AddMethodDynamically (ref TypeBuilder myTypeBld,
                         string mthdName,
                         Type[] mthdParams, 
                         Type returnType,
                         string mthdAction) 
        {
    
       MethodBuilder myMthdBld = myTypeBld.DefineMethod(
                         mthdName,
                         MethodAttributes.Public |
                         MethodAttributes.Static,
                         returnType,
                         mthdParams);    

       ILGenerator ILout = myMthdBld.GetILGenerator();
        
       int numParams = mthdParams.Length;

       for (byte x=0; x<numParams; x++) {
         ILout.Emit(OpCodes.Ldarg_S, x);
        }

           if (numParams > 1) {
               for (int y=0; y<(numParams-1); y++) {
          switch (mthdAction) {
            case "A": ILout.Emit(OpCodes.Add);
                  break;
            case "M": ILout.Emit(OpCodes.Mul);
                  break;
            default: ILout.Emit(OpCodes.Add);
                 break;
          }
        }
       }
       ILout.Emit(OpCodes.Ret);

         

    }

    public static void Main()
        {

       AppDomain myDomain = Thread.GetDomain();
       AssemblyName asmName = new AssemblyName();
       asmName.Name = "DynamicAssembly1";
    
       AssemblyBuilder myAsmBuilder = myDomain.DefineDynamicAssembly(
                      asmName, 
                      AssemblyBuilderAccess.RunAndSave);

          ModuleBuilder myModule = myAsmBuilder.DefineDynamicModule("DynamicModule1",
                                        "MyDynamicAsm.dll");

       TypeBuilder myTypeBld = myModule.DefineType("MyDynamicType",
                                 TypeAttributes.Public);       

       // Get info from the user to build the method dynamically.

       Console.WriteLine("Let's build a simple method dynamically!");
       Console.WriteLine("Please enter a few numbers, separated by spaces.");
       string inputNums = Console.ReadLine();
       Console.Write("Do you want to [A]dd or [M]ultiply these numbers? ");
       string myMthdAction = Console.ReadLine();
       Console.Write("Lastly, what do you want to name your new dynamic method? ");
       string myMthdName = Console.ReadLine();
    
       // Process inputNums into an array and create a corresponding Type array 

       int index = 0;
       string[] inputNumsList = inputNums.Split();

           Type[] myMthdParams = new Type[inputNumsList.Length];
       object[] inputValsList = new object[inputNumsList.Length];
       
       
       foreach (string inputNum in inputNumsList) {
         inputValsList[index] = (object)Convert.ToInt32(inputNum);
        myMthdParams[index] = typeof(int);
        index++;
           } 

       // Now, call the method building method with the parameters, passing the 
       // TypeBuilder by reference.

       AddMethodDynamically(ref myTypeBld,
                myMthdName,
                myMthdParams,
                typeof(int),    
                myMthdAction);

       Type myType = myTypeBld.CreateType();

       Console.WriteLine("---");
       Console.WriteLine("The result of {0} the inputted values is: {1}",
                 ((myMthdAction == "A") ? "adding" : "multiplying"),
                 myType.InvokeMember(myMthdName,
                 BindingFlags.InvokeMethod | BindingFlags.Public |
                 BindingFlags.Static,
                 null,
                 null,
                 inputValsList));
       Console.WriteLine("---");

       // Let's take a look at the method we created.

       // If you are interested in seeing the MSIL generated dynamically for the method
           // your program generated, change to the directory where you ran the compiled
           // code sample and type "ildasm MyDynamicAsm.dll" at the prompt. When the list
           // of manifest contents appears, click on "MyDynamicType" and then on the name of
           // of the method you provided during execution.

       myAsmBuilder.Save("MyDynamicAsm.dll");

       MethodInfo myMthdInfo = myType.GetMethod(myMthdName);
           Console.WriteLine("Your Dynamic Method: {0};", myMthdInfo.ToString()); 
    
    }

}


[C++] 

#using <mscorlib.dll>

using namespace System;
using namespace System::Threading;
using namespace System::Reflection;
using namespace System::Reflection::Emit;


void AddMethodDynamically (TypeBuilder* myTypeBld,
                           String* mthdName,
                           Type* mthdParams[],
                           Type* returnType,
                           String* mthdAction)
{
   MethodBuilder*  myMthdBld = myTypeBld->DefineMethod(
      mthdName,
      static_cast<MethodAttributes>(MethodAttributes::Public | MethodAttributes::Static),
      returnType,
      mthdParams);

   ILGenerator* ILOut = myMthdBld->GetILGenerator();

   int numParams = mthdParams->Length;

   for (Byte x=0; x<numParams; x++) {
      ILOut->Emit(OpCodes::Ldarg_S, x);
   }

   if (numParams > 1) {
      for (int y=0; y<(numParams-1); y++) {
         if(mthdAction->Equals(S"A")) ILOut->Emit(OpCodes::Add);
         else if(mthdAction->Equals(S"M")) ILOut->Emit(OpCodes::Mul);
         else ILOut->Emit(OpCodes::Mul);
      }
   }
   ILOut->Emit(OpCodes::Ret);
}

int main() {

   AppDomain*  myDomain = Thread::GetDomain();
   AssemblyName* asmName = new AssemblyName();
   asmName->Name = S"DynamicAssembly1";

   AssemblyBuilder*  myAsmBuilder = myDomain->DefineDynamicAssembly(asmName,
      AssemblyBuilderAccess::RunAndSave);

   ModuleBuilder*  myModule = myAsmBuilder->DefineDynamicModule(S"DynamicModule1",
      S"MyDynamicAsm.dll");

   TypeBuilder*  myTypeBld = myModule->DefineType(S"MyDynamicType",
      TypeAttributes::Public);

   // Get info from the user to build the method dynamically.

   Console::WriteLine(S"Let's build a simple method dynamically!");
   Console::WriteLine(S"Please enter a few numbers, separated by spaces.");
   String* inputNums = Console::ReadLine();
   Console::Write(S"Do you want to [A]dd or [M]ultiply these numbers? ");
   String* myMthdAction = Console::ReadLine();
   Console::Write(S"Lastly, what do you want to name your new dynamic method? ");
   String* myMthdName = Console::ReadLine();

   // Process inputNums into an array and create a corresponding Type array

   int index = 0;
   String* inputNumsList[] = inputNums->Split(0);

   Type* myMthdParams[] = new Type*[inputNumsList->Length];
   Object* inputValsList[] = new Object*[inputNumsList->Length];


   System::Collections::IEnumerator* myEnum = inputNumsList->GetEnumerator();
   while (myEnum->MoveNext()) {
      String* inputNum = __try_cast<String*>(myEnum->Current);

      inputValsList[index] = __box(Convert::ToInt32(inputNum));
      myMthdParams[index] = __typeof(int);
      index++;
   }

   // Now, call the method building method with the parameters, passing the
   // TypeBuilder by reference.

   AddMethodDynamically(myTypeBld, 
      myMthdName,
      myMthdParams,
      __typeof(int),
      myMthdAction);

   Type*  myType = myTypeBld->CreateType();

   Console::WriteLine(S"---");
   Console::WriteLine(S"The result of {0} the inputted values is: {1}",
      ((myMthdAction->Equals(S"A")) ? S"adding" : S"multiplying"),
      myType->InvokeMember(myMthdName,static_cast<BindingFlags>(BindingFlags::InvokeMethod | BindingFlags::Public |
      BindingFlags::Static),
      0,
      0,
      inputValsList));
   Console::WriteLine(S"---");

   // Let's take a look at the method we created.

   // If you are interested in seeing the MSIL generated dynamically for the method
   // your program generated, change to the directory where you ran the compiled
   // code sample and type "ildasm MyDynamicAsm.dll" at the prompt. When the list
   // of manifest contents appears, click on "MyDynamicType" and then on the name of
   // of the method you provided during execution.

   myAsmBuilder->Save(S"MyDynamicAsm.dll");

   MethodInfo*  myMthdInfo = myType->GetMethod(myMthdName);
   Console::WriteLine(S"Your Dynamic Method: {0};", myMthdInfo);
}

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

名前空間: System.Reflection.Emit

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ

アセンブリ: Mscorlib (Mscorlib.dll 内)

参照

MethodBuilder メンバ | System.Reflection.Emit 名前空間