靠近IL用DynamicMethod简单实现方法

最近一直在学习Emit,对指令有一些了解.总结了一些小经验在IL指令中经常的事情就
是把变量,参数推到堆栈上然后call一些方法,来来回回的这样做.下面贴个用DynamicMethod简单实现方法的代码:)
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Reflection.Emit;
namespace ConsoleApplication1
{
    
class Program
    
{
        
static void Main(string[] args)
        
{


            DynamicMethod dm 
= new DynamicMethod("Test"null,
                
new Type[] typeofstring) },typeof(string).Module);
            ILGenerator il 
= dm.GetILGenerator();
            il.Emit(OpCodes.Ldarg_0);
//把参数推到堆栈上
            MethodInfo call = typeof(Console).GetMethod("WriteLine"new Type[] typeof(string)});
            il.Emit(OpCodes.Call, call);
//执行Console.WriteLine方法
            il.Emit(OpCodes.Ret);//结束返回
            Action<string> test = (Action<string>)dm.CreateDelegate(typeof(Action<string>));
            test(
"henry");

            
//下面Test1方法和Test完成的方法是一样的,但IL似乎有些不同.
            
//主要体现变量设置,对于变量的位置也会影响指令
            dm = new DynamicMethod("Test1"null,
                
new Type[] typeof(string) }typeof(string).Module);
            il 
= dm.GetILGenerator();
            il.DeclareLocal(
typeof(string));
            il.Emit(OpCodes.Ldarg_0);
//把参数推到堆栈上
            il.Emit(OpCodes.Stloc_0);//把值保存到索引为0的变量里
            il.Emit(OpCodes.Ldloc_0);//把索引为0的变量推到堆栈上
            call = typeof(Console).GetMethod("WriteLine"new Type[] typeof(string) });
            il.Emit(OpCodes.Call, call);
//执行Console.WriteLine方法
            il.Emit(OpCodes.Ret);
             test 
= (Action<string>)dm.CreateDelegate(typeof(Action<string>));
            test(
"henry");

            
//对于下面的方法大家自己推一下,其实很简单.
            
//如果看起来有不明白,不防copy到vs.net上然后看指令描述信息:)
            dm = new DynamicMethod("Test2"null,
               
new Type[] typeof(string) }typeof(string).Module);
            il 
= dm.GetILGenerator();
            il.DeclareLocal(
typeof(string));
            il.Emit(OpCodes.Ldstr, 
"你好 ");
            il.Emit(OpCodes.Ldarg_0);
            call 
= typeof(string).GetMethod("Concat"new Type[] {typeof(string),typeof(string) });
            il.Emit(OpCodes.Call, call);
            il.Emit(OpCodes.Stloc_0);
            il.Emit(OpCodes.Ldloc_0);
            call 
= typeof(Console).GetMethod("WriteLine"new Type[] typeof(string) });
            il.Emit(OpCodes.Call, call);
            il.Emit(OpCodes.Ret);
            test 
= (Action<string>)dm.CreateDelegate(typeof(Action<string>));
            test(
"henry");
            Console.Read();
            


        }

       
    }

}

当你熟了某些指令的时候,事情就变得简单并不是想象中复杂.

posted on 2008-05-21 16:53  henry  阅读(4066)  评论(6编辑  收藏  举报

导航