public static LambdaExpression Decompile(MethodInfo method) { var args = method.GetParameters() .Select(p => (Address)Expression.Parameter(p.ParameterType, p.Name)) .ToList(); if (!method.IsStatic) { args.Insert(0, Expression.Parameter(method.DeclaringType, "this")); } var body = method.GetMethodBody(); var addresses = new VariableInfo[body.LocalVariables.Count]; for (int i = 0; i < addresses.Length; i++) { addresses[i] = new VariableInfo(body.LocalVariables[i].LocalType); } var locals = addresses.ToArray(); var instructions = method.GetInstructions(); var ex = Processor.Process(locals, args, instructions.First(), method.ReturnType); return(Expression.Lambda(new OptimizeExpressionVisitor().Visit(ex), args.Select(x => (ParameterExpression)x.Expression))); }
static Expression DecompileConcrete(MethodInfo method, IList <Address> args) { var body = method.GetMethodBody(); var addresses = new VariableInfo[body.LocalVariables.Count]; for (var i = 0; i < addresses.Length; i++) { addresses[i] = new VariableInfo(body.LocalVariables[i].LocalType); } var locals = addresses.ToArray(); var instructions = method.GetInstructions(); return(Processor.Process(locals, args, instructions.First(), method.ReturnType)); }
public MethodBodyDecompiler(MethodInfo method) { this.method = method; var parameters = method.GetParameters(); if (method.IsStatic) args = parameters .Select(p => (Address) Expression.Parameter(p.ParameterType, p.Name)) .ToList(); else args = new[] {(Address) Expression.Parameter(method.DeclaringType, "this")} .Union(parameters.Select(p => (Address) Expression.Parameter(p.ParameterType, p.Name))) .ToList(); var body = method.GetMethodBody(); var addresses = new VariableInfo[body.LocalVariables.Count]; for (int i = 0; i < addresses.Length; i++) { addresses[i] = new VariableInfo(body.LocalVariables[i].LocalType); } locals = addresses.ToArray(); }