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
}
}
|