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

你可能感兴趣的:(reflection)