//+ 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;
}