Reflection.Emit方法调用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection.Emit;

namespace ConsoleApplication1
{
    public delegate System.String FeedbackToString();

    class Program
    {
        static void Main(string[] args)
        {
            DynamicMethod dynamicMethod = new DynamicMethod(System.String.Empty,typeof(System.String),null,typeof(Program).Module);
            ILGenerator iLGenerator = dynamicMethod.GetILGenerator();
            LocalBuilder localBuilder = iLGenerator.DeclareLocal(typeof(System.String), true);
            iLGenerator.Emit(OpCodes.Ldstr,"Hello,World!");
            iLGenerator.Emit(OpCodes.Stloc,localBuilder);
            iLGenerator.Emit(OpCodes.Ldloc,localBuilder);
            iLGenerator.Emit(OpCodes.Ret);
            FeedbackToString fb = (FeedbackToString)dynamicMethod.CreateDelegate(typeof(FeedbackToString));
            Console.WriteLine("The result is {0}", fb());
            Console.Read();
        }
    }
}

 

看看对应的IL:

.class private autoansibeforefieldinit Program
    extends [mscorlib]System.Object
{
    .method public hidebysig specialname rtspecialname instance void .ctor()cilmanaged
    {
        .maxstack 8
        L_0000: ldarg.0 
        L_0001: call instance void [mscorlib]System.Object::.ctor()
        L_0006: ret 
    }

    .method private hidebysig static void Main(string[] args)cilmanaged
    {
        .entrypoint
        .maxstack 5
        .locals init (
            [0] class [mscorlib]System.Reflection.Emit.DynamicMethod dynamicMethod,
            [1] class [mscorlib]System.Reflection.Emit.ILGenerator iLGenerator,
            [2] class [mscorlib]System.Reflection.Emit.LocalBuilder localBuilder,
            [3] class ConsoleApplication1.FeedbackToString fb)
        L_0000: nop 
        L_0001: ldsfld string [mscorlib]System.String::Empty
        L_0006: ldtoken string
        L_000b: call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
        L_0010: ldnull 
        L_0011: ldtoken ConsoleApplication1.Program
        L_0016: call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
        L_001b: callvirt instance class [mscorlib]System.Reflection.Module [mscorlib]System.Type::get_Module()
        L_0020: newobj instance void [mscorlib]System.Reflection.Emit.DynamicMethod::.ctor(string, class [mscorlib]System.Type, class [mscorlib]System.Type[], class [mscorlib]System.Reflection.Module)
        L_0025: stloc.0 
        L_0026: ldloc.0 
        L_0027: callvirt instance class [mscorlib]System.Reflection.Emit.ILGenerator [mscorlib]System.Reflection.Emit.DynamicMethod::GetILGenerator()
        L_002c: stloc.1 
        L_002d: ldloc.1 
        L_002e: ldtoken string
        L_0033: call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
        L_0038: ldc.i4.1 
        L_0039: callvirt instance class [mscorlib]System.Reflection.Emit.LocalBuilder [mscorlib]System.Reflection.Emit.ILGenerator::DeclareLocal(class [mscorlib]System.Type, bool)
        L_003e: stloc.2 
        L_003f: ldloc.1 
        L_0040: ldsfld valuetype [mscorlib]System.Reflection.Emit.OpCode [mscorlib]System.Reflection.Emit.OpCodes::Ldstr
        L_0045: ldstr "Hello,World!"
        L_004a: callvirt instance void [mscorlib]System.Reflection.Emit.ILGenerator::Emit(valuetype [mscorlib]System.Reflection.Emit.OpCode, string)
        L_004f: nop 
        L_0050: ldloc.1 
        L_0051: ldsfld valuetype [mscorlib]System.Reflection.Emit.OpCode [mscorlib]System.Reflection.Emit.OpCodes::Stloc
        L_0056: ldloc.2 
        L_0057: callvirt instance void [mscorlib]System.Reflection.Emit.ILGenerator::Emit(valuetype [mscorlib]System.Reflection.Emit.OpCode, class [mscorlib]System.Reflection.Emit.LocalBuilder)
        L_005c: nop 
        L_005d: ldloc.1 
        L_005e: ldsfld valuetype [mscorlib]System.Reflection.Emit.OpCode [mscorlib]System.Reflection.Emit.OpCodes::Ldloc
        L_0063: ldloc.2 
        L_0064: callvirt instance void [mscorlib]System.Reflection.Emit.ILGenerator::Emit(valuetype [mscorlib]System.Reflection.Emit.OpCode, class [mscorlib]System.Reflection.Emit.LocalBuilder)
        L_0069: nop 
        L_006a: ldloc.1 
        L_006b: ldsfld valuetype [mscorlib]System.Reflection.Emit.OpCode [mscorlib]System.Reflection.Emit.OpCodes::Ret
        L_0070: callvirt instance void [mscorlib]System.Reflection.Emit.ILGenerator::Emit(valuetype [mscorlib]System.Reflection.Emit.OpCode)
        L_0075: nop 
        L_0076: ldloc.0 
        L_0077: ldtoken ConsoleApplication1.FeedbackToString
        L_007c: call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
        L_0081: callvirt instance class [mscorlib]System.Delegate [mscorlib]System.Reflection.Emit.DynamicMethod::CreateDelegate(class [mscorlib]System.Type)
        L_0086: castclass ConsoleApplication1.FeedbackToString
        L_008b: stloc.3 
        L_008c: ldstr "The result is {0}"
        L_0091: ldloc.3 
        L_0092: callvirt instance string ConsoleApplication1.FeedbackToString::Invoke()
        L_0097: call void [mscorlib]System.Console::WriteLine(string, object)
        L_009c: nop 
        L_009d: call int32 [mscorlib]System.Console::Read()
        L_00a2: pop 
        L_00a3: ret 
    }

}
Collapse Methods
posted @ 2012-04-18 15:12  szjdw  阅读(620)  评论(0编辑  收藏  举报