Пример #1
0
        private void ReSetValue(ILGenerator il, Type[] paramTypes, LocalBuilder obj_arr)
        {
            if (obj_arr == null)
            {
                return;
            }

            for (int i = 0; i < paramTypes.Length; i++)
            {
                var paramType = paramTypes[i];
                if (!paramType.IsByRef) //非ref模式的直接跳过
                {
                    continue;
                }

                il.Emit(OpCodes.Ldloc, obj_arr); //数组对象入栈
                il.Emit(OpCodes.Ldc_I4, i);      //下标入栈

                Type unRefType = TypeHelper.GetUnRefType(paramType);
                if (unRefType.IsValueType)
                {
                    il.Emit(OpCodes.Ldarg, i + 1); //对应下标的参数值入栈,注:OpCodes.Ldarg_0 此时代表类对象本身,参数列表的下标从1开始
                    EmitHelper.Ldind(il, unRefType);
                    il.Emit(OpCodes.Box, unRefType);
                }
                else
                {
                    il.Emit(OpCodes.Ldarg_S, i + 1);
                    il.Emit(OpCodes.Ldind_Ref);
                }

                il.Emit(OpCodes.Stelem_Ref); //进行数组的赋值操作
            }
        }
Пример #2
0
        public static LocalBuilder ParameterArray(ILGenerator il, Type[] paramTypes)
        {
            var obj_arr = il.DeclareLocal(typeof(object[])); //声明数组的局部变量

            il.Emit(OpCodes.Ldc_I4, paramTypes.Length);      //数组长度入栈
            il.Emit(OpCodes.Newarr, typeof(object));         //初始化数组
            il.Emit(OpCodes.Stloc, obj_arr);                 //对数组的局部变量赋值

            //各个参数进数组
            for (int i = 0; i < paramTypes.Length; i++)
            {
                il.Emit(OpCodes.Ldloc, obj_arr); //数组对象入栈
                il.Emit(OpCodes.Ldc_I4, i);      //下标入栈

                var paramType = paramTypes[i];

                //对应下标的参数值入栈,注:OpCodes.Ldarg_0 此时代表类对象本身,参数列表的下标从1开始
                if (!paramType.IsByRef)
                {
                    if (!paramType.IsValueType)
                    {
                        il.Emit(OpCodes.Ldarg, i + 1);
                    }
                    else
                    {
                        il.Emit(OpCodes.Ldarg, i + 1);
                        il.Emit(OpCodes.Box, paramType);
                    }
                }
                else
                {
                    Type unRefType = TypeHelper.GetUnRefType(paramType);
                    if (unRefType.IsValueType)
                    {
                        il.Emit(OpCodes.Ldarg, i + 1);
                        EmitHelper.Ldind(il, unRefType);
                        il.Emit(OpCodes.Box, unRefType);
                    }
                    else
                    {
                        il.Emit(OpCodes.Ldarg_S, i + 1);
                        il.Emit(OpCodes.Ldind_Ref);
                    }
                }

                il.Emit(OpCodes.Stelem_Ref); //进行数组的赋值操作
            }

            return(obj_arr);
        }