Ejemplo n.º 1
0
        public object ExecuteTyped(MethodInfo method, params object[] args)
        {
            var argLength        = args?.Length;
            var methodParameters = method.GetParameters();

            if (method.CallingConvention == CallingConventions.VarArgs)
            {
                // throw new PlatformID
            }
            var methodParameterCount = methodParameters.Length;

            if (methodParameterCount == 0 && method.ContainsGenericParameters)
            {
                //var genericArguments = method.GetGenericArguments().Length;
            }
            if (!method.IsStatic)
            {
                methodParameterCount += 1;
            }
            var body           = method.GetMethodBody();
            var localVariables = body.LocalVariables;

            if (methodParameterCount != argLength)
            {
                bool parsedParamArray = false;
                for (var i = 0; parsedParamArray == false && i < methodParameters.Length; i++)
                {
                    if (methodParameters[i].GetCustomAttribute <ParamArrayAttribute>() != null)
                    {
                        parsedParamArray = true;
                        var l = new List <object>();
                        for (var k = 0; k < i; k++)
                        {
                            l.Add(args[k]);
                        }

                        var paramArgs = new object[args.Length - i];
                        for (var k = i; k < args.Length; k++)
                        {
                            paramArgs[k - i] = args[k];
                        }
                        l.Add(paramArgs);
                        args = l.ToArray();
                    }
                }
                //if (argLength < methodParameterCount || !methodParameters.Any(x => !(x.GetCustomAttribute<ParamArrayAttribute>() is null)))
                if (!parsedParamArray)
                {
                    throw new TargetParameterCountException($"{method.ReflectedType.Name}::{method} does not take {argLength} parameters");
                }
            }

            var methodBytes  = method.GetMethodBody().GetILAsByteArray();
            var ilStream     = ILInstructionReader.FromByteCode(method.GetMethodBody().GetILAsByteArray());
            var ilStreamCode = ILInstructionReader.ToString(ilStream);


            var resolver = new ILInstructionResolver(method);
            var locals   = new ILVariable[localVariables.Count];

            for (var i = 0; i < locals.Length; i++)
            {
                locals[localVariables[i].LocalIndex].CopyFrom(localVariables[i], body.InitLocals);
            }


            bool doTrace = bool.Parse(bool.FalseString);

            if (doTrace)
            {
                System.Diagnostics.Trace.WriteLine(method);
                if (args != null && args.Length > 0)
                {
                    System.Diagnostics.Trace.WriteLine(string.Join("\r\n", Enumerable.Range(0, args.Length).Select(i => $"arg[{i}]: {args[i]}")));
                }
                if (locals != null && locals.Length > 0)
                {
                    System.Diagnostics.Trace.WriteLine(string.Join("\r\n", Enumerable.Range(0, locals.Length).Select(i => $"loc[{i}]: {locals[i]}")));
                }

                System.Diagnostics.Trace.WriteLine(ilStreamCode);
            }
            return(ExecuteTyped(ilStream, resolver, args.ToArray(), locals));
        }
 public void SetResolver(Module module)
 {
     Resolver = new ILInstructionResolver(module);
 }
        public object ExecuteTyped(MethodInfo method, params object[] args)
        {
            var argLength        = args?.Length;
            var methodParameters = method.GetParameters();

            if (method.CallingConvention == CallingConventions.VarArgs)
            {
                // throw new PlatformID
            }
            var methodParameterCount = methodParameters.Length;

            if (methodParameterCount == 0 && method.ContainsGenericParameters)
            {
                //var genericArguments = method.GetGenericArguments().Length;
            }
            if (!method.IsStatic)
            {
                methodParameterCount += 1;
            }
            var body           = method.GetMethodBody();
            var localVariables = body.LocalVariables;

            if (methodParameterCount != argLength)
            {
                bool parsedParamArray = false;
                for (var i = 0; parsedParamArray == false && i < methodParameters.Length; i++)
                {
                    if (methodParameters[i].GetCustomAttribute <ParamArrayAttribute>() != null)
                    {
                        parsedParamArray = true;
                        var l = new List <object>();
                        for (var k = 0; k < i; k++)
                        {
                            l.Add(args[k]);
                        }

                        var paramArgs = new object[args.Length - i];
                        for (var k = i; k < args.Length; k++)
                        {
                            paramArgs[k - i] = args[k];
                        }
                        l.Add(paramArgs);
                        args = l.ToArray();
                    }
                }
                //if (argLength < methodParameterCount || !methodParameters.Any(x => !(x.GetCustomAttribute<ParamArrayAttribute>() is null)))
                if (!parsedParamArray)
                {
                    throw new TargetParameterCountException($"{method.ReflectedType.Name}::{method} does not take {argLength} parameters");
                }
            }


            //var ilStream = IlInstructionReader.FromByteCode(method.GetMethodBody().GetILAsByteArray());
            //var ilStreamCode = IlInstructionReader.ToString(ilStream);
            var ms       = new MemoryStream(method.GetMethodBody().GetILAsByteArray());
            var resolver = new ILInstructionResolver(method);
            var locals   = localVariables.Select(x => new ILVariable {
                Index = x.LocalIndex, Type = x.LocalType, Value = body.InitLocals && x.LocalType.IsValueType ? Activator.CreateInstance(x.LocalType) : null
            }).ToArray();

            return(ExecuteTyped(ms, resolver, args.ToArray(), locals));
        }
 public void SetResolver(MethodInfo method)
 {
     Resolver = new ILInstructionResolver(method);
 }