您的位置:首页 > 编程语言 > C#

.NET(C#):Emit创建异常处理的方法

2013-04-24 14:34 1381 查看

        //+ using System.Reflection;

        //+ using System.Reflection.Emit;
        static void Main(string[] args)
        {
            var dm = GetMethod();

            dm.Invoke(null, new object[] { new Exception("来自Mgen!") });
        }

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

            //临时变量 和 需要的反射信息

            var exp = ilgen.DeclareLocal(typeof(Exception));

            var msg = typeof(Exception).GetProperty("Message").GetGetMethod();

            var output = typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string), typeof(object) });

            //保存异常对象到临时变量exp

            ilgen.Emit(OpCodes.Stloc, exp);

            //格式字符串进栈

            ilgen.Emit(OpCodes.Ldstr, "错误信息: {0}");

            //加载临时变量

            ilgen.Emit(OpCodes.Ldloc, exp);

            //获取Message属性

            ilgen.Emit(OpCodes.Callvirt, msg);

            //调用有格式字符串的Console.WriteLine

            ilgen.Emit(OpCodes.Call, output);

            //结束整个处理块

            ilgen.EndExceptionBlock();

            ilgen.Emit(OpCodes.Ret);

            return dm;

        }

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Emit 异常
相关文章推荐