C#DynamicMethod

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Reflection.Emit;
using System.Globalization;
namespace Test
{
    class Program
    {
        private delegate int HelloDelegate(string msg, int ret);
        static void Main(string[] args)
        {
            Type[] helloArg = { typeof(string), typeof(int) };
            DynamicMethod hello = new DynamicMethod("SayHello", typeof(int), helloArg);
            Type[] writeStringArgs = { typeof(string) };
            MethodInfo witeString = typeof(Console).GetMethod("WriteLine", writeStringArgs);
            #region 定义SayHello方法体
            ILGenerator il = hello.GetILGenerator(256);
            il.Emit(OpCodes.Ldarg_0);
            il.EmitCall(OpCodes.Call, witeString, null);
            il.Emit(OpCodes.Ldarg_1);
            il.Emit(OpCodes.Ret);
            hello.DefineParameter(1, ParameterAttributes.In, "message");
            hello.DefineParameter(2, ParameterAttributes.In, "valueToReturn");
            #endregion 
            #region  执行方法
            HelloDelegate hi = (HelloDelegate)hello.CreateDelegate(typeof(HelloDelegate));
            int i = hi("Hello DynameicMethod", 45);
            Console.WriteLine(i.ToString());
            object[] invokeArgs = {"\r\nHello,World" ,42};
            object objRet=hello.Invoke(null,BindingFlags.ExactBinding,null,invokeArgs,new CultureInfo("en-us"));
            Console.WriteLine(objRet.ToString());
            #endregion
            
            Console.ReadKey();

        }
    }
}

 

posted on 2012-12-13 13:34  R.Ray  阅读(1330)  评论(0)    收藏  举报

导航