//+ using System.Reflection;
        //+ using System.Reflection.Emit;
        static void Main(string[] args)
        {
            var dm = GetMethod();
            dm.Invoke(null, new object[] { new ApplicationException() });
            dm.Invoke(null, new object[] { new Exception() });
        }
        static DynamicMethod GetMethod()
        {
            var dm = new DynamicMethod("", null, new Type[] { typeof(Exception) });
            var ilgen = dm.GetILGenerator();
            //try {
            ilgen.BeginExceptionBlock();
            //加载第一个参数,并throw
            ilgen.Emit(OpCodes.Ldarg_0);
            ilgen.Emit(OpCodes.Throw);
            ilgen.BeginCatchBlock(typeof(ApplicationException));
            //清空栈上的异常对象
            ilgen.Emit(OpCodes.Pop);
            ilgen.EmitWriteLine("捕获ApplicationException");
            ilgen.BeginCatchBlock(typeof(Exception));
            //清空栈上的异常对象
            ilgen.Emit(OpCodes.Pop);
            ilgen.EmitWriteLine("捕获Exception");
            ilgen.BeginFinallyBlock();
            ilgen.EmitWriteLine("finally块");
             //结束整个处理块
            ilgen.EndExceptionBlock();
            ilgen.Emit(OpCodes.Ret);
            return dm;
        }
输出:
复制代码 代码如下:
捕获ApplicationException
finally块
捕获Exception
finally块
 
  
//+ using System.Reflection;
//+ using System.Reflection.Emit;
static void Main(string[] args)
{
    //创建DynamicMethod对象
    var dm = GetFor();
    //测试
    dm.Invoke(null, new object[] { 3 });
}
static DynamicMethod GetFor()
{
    var dm = new DynamicMethod("", null, new Type[] { typeof(int) });
    var gen = dm.GetILGenerator();
    //临时变量i
    LocalBuilder locI = gen.DeclareLocal(typeof(int));
    Label lbCondition = gen.DefineLabel();
    Label lbTrue = gen.DefineLabel();
    //i=0
    gen.Emit(OpCodes.Ldc_I4_0);
    gen.Emit(OpCodes.Stloc, locI);
    //跳至判断
    gen.Emit(OpCodes.Br, lbCondition);
    //标记True代码
    gen.MarkLabel(lbTrue);
    //Console.WriteLine(i)
    gen.Emit(OpCodes.Ldloc, locI);
    gen.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(int) }));
    //追加代码
    //i++
    gen.Emit(OpCodes.Ldloc, locI);
    gen.Emit(OpCodes.Ldc_I4_1);
    gen.Emit(OpCodes.Add);
    gen.Emit(OpCodes.Stloc, locI);
    //判断代码
    gen.MarkLabel(lbCondition);
    gen.Emit(OpCodes.Ldloc, locI);
    gen.Emit(OpCodes.Ldarg_0);
    gen.Emit(OpCodes.Clt);
    //如果True,跳至true代码
    gen.Emit(OpCodes.Brtrue, lbTrue);
    gen.Emit(OpCodes.Ret);
    return dm;
}
 
  
static void doo(Exception e)
{
    try
    {
        throw e;
    }
    catch (ApplicationException ex)
    {
        Console.WriteLine("捕获ApplicationException");
    }
    catch
    {
        Console.WriteLine("捕获Exception");
    }
    finally
    {
        Console.WriteLine("finally块");
    }
}
 
  
//+ using System.Reflection;
//+ using System.Reflection.Emit;
static void Main(string[] args)
{
    var dm = GetMethod();
    dm.Invoke(null, new object[] { new ApplicationException() });
    dm.Invoke(null, new object[] { new Exception() });
}
static DynamicMethod GetMethod()
{
    var dm = new DynamicMethod("", null, new Type[] { typeof(Exception) });
    var ilgen = dm.GetILGenerator();
    //try {
    ilgen.BeginExceptionBlock();
    //加载第一个参数,并throw
    ilgen.Emit(OpCodes.Ldarg_0);
    ilgen.Emit(OpCodes.Throw);
    ilgen.BeginCatchBlock(typeof(ApplicationException));
    //清空栈上的异常对象
    ilgen.Emit(OpCodes.Pop);
    ilgen.EmitWriteLine("捕获ApplicationException");
    ilgen.BeginCatchBlock(typeof(Exception));
    //清空栈上的异常对象
    ilgen.Emit(OpCodes.Pop);
    ilgen.EmitWriteLine("捕获Exception");
    ilgen.BeginFinallyBlock();
    ilgen.EmitWriteLine("finally块");
    //结束整个处理块
    ilgen.EndExceptionBlock();
    ilgen.Emit(OpCodes.Ret);
    return dm;
}