internal static bool Inject(ReturnData data, AttributesHelper.AttributeData hook) { try { ConsoleHelper.WriteMessage(ConsoleHelper.MessageType.Wait, $"Injecting method \"{data.typeDefinition.Name}.{data.methodDefinition.Name}\".."); //reflcator var injector = hook.Method.ReturnType != hook.Assembly.MainModule.TypeSystem.Void ? data.methodDefinition.Parameters.Count > 0 ? new InjectionDefinition(data.methodDefinition, hook.Method, InjectFlags.PassInvokingInstance | InjectFlags.PassParametersRef | InjectFlags.ModifyReturn) : new InjectionDefinition(data.methodDefinition, hook.Method, InjectFlags.PassInvokingInstance | InjectFlags.ModifyReturn) : data.methodDefinition.Parameters.Count > 0 ? new InjectionDefinition(data.methodDefinition, hook.Method, InjectFlags.PassInvokingInstance | InjectFlags.PassParametersRef) : new InjectionDefinition(data.methodDefinition, hook.Method, InjectFlags.PassInvokingInstance); if ((bool)hook.Attribute.ConstructorArguments[1].Value) { injector.Inject(-1); } else { injector.Inject(); } ConsoleHelper.WriteMessage(ConsoleHelper.MessageType.Success, $"Injected method \"{data.typeDefinition.Name}.{data.methodDefinition.Name}\"."); return(true); } catch (Exception ex) { ConsoleHelper.WriteError($"Something went wrong while injecting."); ConsoleHelper.WriteError($"Message: {ex.Message}"); if (!(ex is InjectionDefinitionException)) { ConsoleHelper.WriteError(ex.StackTrace); } } return(false); }
public static bool InjectNewMethod(TypeDefinition type, AssemblyDefinition assembly, string methodName, AttributesHelper.AttributeData hook) { try { ConsoleHelper.WriteMessage(ConsoleHelper.MessageType.Wait, $"Injecting new method \"{type.Name}.{methodName}\".."); var methodDefinition = new MethodDefinition(methodName, MethodAttributes.Public, assembly.MainModule.TypeSystem.Void) { IsStatic = type.IsSealed }; type.Methods.Add(methodDefinition); var il = methodDefinition.Body.GetILProcessor(); if (!type.IsSealed) { methodDefinition.Body.Instructions.Add(il.Create(OpCodes.Ldarg_0)); } methodDefinition.Body.Instructions.Add(il.Create(OpCodes.Call, assembly.MainModule.Import(hook.Method))); methodDefinition.Body.Instructions.Add(Instruction.Create(OpCodes.Ret)); ConsoleHelper.WriteMessage(ConsoleHelper.MessageType.Success, $"Injected new method \"{type.Name}.{methodName}\"."); return(true); } catch (Exception ex) { ConsoleHelper.WriteError($"Something went wrong while injecting."); ConsoleHelper.WriteError($"Message: {ex.Message}"); if (!(ex is InjectionDefinitionException)) { ConsoleHelper.WriteError(ex.StackTrace); } return(false); } }