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();
}
}
}