快速编写和调试 Emit 生成 IL 的代码(2)

如何执行多参数Func委托方法
废话不多说,上代码

        public static void ILDemo()
        {
            //获取当前AppDomain
            AppDomain currentAppDomain = AppDomain.CurrentDomain;
            //创建程序集
            AssemblyName assemblyName = new AssemblyName("MyAssembly");
            assemblyName.CultureInfo = System.Globalization.CultureInfo.CurrentCulture; // = "zh-CN" 
            assemblyName.SetPublicKeyToken(new Guid().ToByteArray());
            AssemblyBuilder assBuilder = currentAppDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
            //创建模块
            ModuleBuilder moduleBuilder = assBuilder.DefineDynamicModule("MyAssemblyType");
            //创建类型
            var typeBuilder = moduleBuilder.DefineType("MyAssemblyType.MyClass", TypeAttributes.Public);
            //获取委托方法对象
            var DelegateFunc2 = GetMethodParam2();
            Type[] mthdParams = DelegateFunc2.Method.GetParameters().Select(p => p.ParameterType).ToArray();
            Type returnType = DelegateFunc2.Method.ReturnType;

            //构建IL委托字段
            FieldBuilder fldBuilder = typeBuilder.DefineField("DynamicField", DelegateFunc2.GetType(), FieldAttributes.Public);
            //构建IL委托方法
            MethodBuilder myMthdBld = typeBuilder.DefineMethod(
                                                "addtest",
                                                MethodAttributes.Public,
                                                returnType,
                                                mthdParams);
            // 通过方法构建器获取一个MSIL生成器
            ILGenerator ILout = myMthdBld.GetILGenerator();
            ILout.Emit(OpCodes.Nop);

            ILout.Emit(OpCodes.Ldarg_0);
            ILout.Emit(OpCodes.Ldfld, fldBuilder);

            //循环 委托方法中 变量
            if (mthdParams.Length > 0)
            {
                for (int i = 1; i <= mthdParams.Length; i++)
                {
                    ILout.Emit(OpCodes.Ldarg, i);
                }
            }
            //IL方法中 执行委托方法
            ILout.Emit(OpCodes.Callvirt, DelegateFunc2.GetType().GetMethod("Invoke"));
            ILout.Emit(OpCodes.Ret);

            //构建对象
            Type t = typeBuilder.CreateType();
            object o1 = Activator.CreateInstance(t);
            //把委托方法  赋值给  DynamicField字段
            t.GetField("DynamicField").SetValue(o1, DelegateFunc2);
            //执行o1 addtest方法  为方法中参数: new object[] { "参数1", "参数2" }
            var result = t.GetMethod("addtest").Invoke(o1, new object[] { "参数1", "参数2" });
            Console.WriteLine("result = " + result);
            Console.ReadKey();
        }

        /// <summary>
        /// 带参数委托方法
        /// 定义2个参数
        /// </summary>
        /// <returns></returns>
        public static Delegate GetMethodParam2()
        {
            return (new Func<string, string, object>((string str, string str3) =>
            {
                return str + "_" + str3;
            }));
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值