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

转载于:https://www.cnblogs.com/szjdw/archive/2012/04/18/2455337.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值