MethodBuilder.CreateMethodBody(Byte[], Int32) 方法    
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
使用 Microsoft 中间语言 (MSIL) 指令提供的字节数组的创建方法的主体。
public:
 void CreateMethodBody(cli::array <System::Byte> ^ il, int count);public void CreateMethodBody(byte[] il, int count);member this.CreateMethodBody : byte[] * int -> unitPublic Sub CreateMethodBody (il As Byte(), count As Integer)参数
- il
- Byte[]
包含有效的 MSIL 指令的数组。 如果此参数为 null,则清除方法的主体。
- count
- Int32
MSIL 数组中的有效字节数。 如果 MSIL 为 null,则忽略此值。
例外
              count 不在提供的 MSIL 指令数组的索引范围内,且 il 不是 null。
该包含类型是以前使用 CreateType() 创建的。
- 或 -
以前在包含不是 null 的 il 参数的此 MethodBuilder 上调用了此方法。
- 或 -
对于当前的方法,属性 IsGenericMethod 为 true,但属性 IsGenericMethodDefinition 为 false。
示例
在下面的示例中,使用 CreateMethodBody通过操作码生成添加两个整数的简单方法。
using System;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;
class MethodBodyDemo {
// This class will demonstrate how to create a method body using
// the MethodBuilder.CreateMethodBody(byte[], int) method.
   public static Type BuildDynType() {
    Type addType = null;
        AppDomain currentDom = Thread.GetDomain();
        AssemblyName myAsmName = new AssemblyName();
    myAsmName.Name = "MyDynamicAssembly";
        AssemblyBuilder myAsmBldr = currentDom.DefineDynamicAssembly(
                           myAsmName,
                           AssemblyBuilderAccess.RunAndSave);
        // The dynamic assembly space has been created.  Next, create a module
        // within it.  The type Point will be reflected into this module.
    ModuleBuilder myModuleBldr = myAsmBldr.DefineDynamicModule("MyModule");
    TypeBuilder myTypeBldr =  myModuleBldr.DefineType("Adder");
        MethodBuilder myMthdBldr = myTypeBldr.DefineMethod("DoAdd",
                                MethodAttributes.Public |
                                MethodAttributes.Static,
                                typeof(int),
                                new Type[]
                                {typeof(int), typeof(int)});
        // Build the array of Bytes holding the MSIL instructions.
        byte[] ILcodes = new byte[] {
          0x02,   /* 02h is the opcode for ldarg.0 */
      0x03,   /* 03h is the opcode for ldarg.1 */
      0x58,   /* 58h is the opcode for add     */
      0x2A    /* 2Ah is the opcode for ret     */
    };
    
    myMthdBldr.CreateMethodBody(ILcodes, ILcodes.Length);
        addType = myTypeBldr.CreateType();
    return addType;
   }
   public static void Main() {
    Type myType = BuildDynType();
        Console.WriteLine("---");
    Console.Write("Enter the first integer to add: ");
        int aVal = Convert.ToInt32(Console.ReadLine());
        Console.Write("Enter the second integer to add: ");
        int bVal = Convert.ToInt32(Console.ReadLine());
        object adderInst = Activator.CreateInstance(myType, new object[0]);
    Console.WriteLine("The value of adding {0} to {1} is: {2}.",
               aVal, bVal,	
                   myType.InvokeMember("DoAdd",
                           BindingFlags.InvokeMethod,
                           null,
                           adderInst,
                           new object[] {aVal, bVal}));
   }
}
Imports System.Threading
Imports System.Reflection
Imports System.Reflection.Emit
 _
Class MethodBodyDemo
   
   ' This class will demonstrate how to create a method body using 
   ' the MethodBuilder.CreateMethodBody(byte[], int) method.
   Public Shared Function BuildDynType() As Type
      
      Dim addType As Type = Nothing
      
      Dim currentDom As AppDomain = Thread.GetDomain()
      
      Dim myAsmName As New AssemblyName()
      myAsmName.Name = "MyDynamicAssembly"
      
      Dim myAsmBldr As AssemblyBuilder = currentDom.DefineDynamicAssembly(myAsmName, _
                         AssemblyBuilderAccess.RunAndSave)
      
      ' The dynamic assembly space has been created.  Next, create a module
      ' within it.  The type Point will be reflected into this module.
      Dim myModuleBldr As ModuleBuilder = myAsmBldr.DefineDynamicModule("MyModule")
      
      Dim myTypeBldr As TypeBuilder = myModuleBldr.DefineType("Adder")
      
      Dim myMthdBldr As MethodBuilder = myTypeBldr.DefineMethod("DoAdd", _
                    MethodAttributes.Public Or MethodAttributes.Static, _
                        GetType(Integer), _
                    New Type() {GetType(Integer), GetType(Integer)})
      ' Build the array of Bytes holding the MSIL instructions.
      Dim ILcodes() As Byte = {&H2, &H3, &H58, &H2A}
      ' 02h is the opcode for ldarg.0 
      ' 03h is the opcode for ldarg.1 
      ' 58h is the opcode for add     
      ' 2Ah is the opcode for ret     
      
      myMthdBldr.CreateMethodBody(ILcodes, ILcodes.Length)
      
      addType = myTypeBldr.CreateType()
      
      Return addType
   End Function 'BuildDynType
   
   
   Public Shared Sub Main()
      
      Dim myType As Type = BuildDynType()
      Console.WriteLine("---")
      Console.Write("Enter the first integer to add: ")
      Dim aVal As Integer = Convert.ToInt32(Console.ReadLine())
      
      Console.Write("Enter the second integer to add: ")
      Dim bVal As Integer = Convert.ToInt32(Console.ReadLine())
      
      Dim adderInst As Object = Activator.CreateInstance(myType, New Object() {})
      
      Console.WriteLine("The value of adding {0} to {1} is: {2}.", _
             aVal, bVal, _
             myType.InvokeMember("DoAdd", _
                          BindingFlags.InvokeMethod, _
                          Nothing, _
                          adderInst, _
                          New Object() {aVal, bVal}))
   End Sub
End Class
注解
此方法从 il(包含 MSIL 指令作为操作码的数组)创建方法的主体。 有效 MSIL 的字节数由计数提供。
注意
目前不完全支持此功能。 用户无法提供令牌修复 up 和异常处理程序的位置。