private static MethodDefinition GetHook(List <MethodDefinition> methodDefs, HookData hookData, string className, string methodName) { MethodDefinition methodDef = methodDefs[0]; if (methodDefs.Count == 1) { return(methodDef); } ParameterCollection hookTypes = hookData.Method.Parameters; bool hookStatic = hookData.Method.Parameters.Count == 0 || hookData.Method.Parameters[0].ParameterType.Name != className; for (int i = 0; i < methodDefs.Count; i++) { if (methodDefs[i].IsStatic != hookStatic) { methodDefs.RemoveAt(i--); } } if (hookTypes.Count == 0 || !hookStatic && hookTypes.Count == 1) { for (int i = 0; i < methodDefs.Count; i++) { if (methodDefs[i].Parameters.Count == 0) { return(methodDefs[i]); } } return(methodDef); } for (int i = 0; i < methodDefs.Count; i++) { if (!SafeMatch(methodDefs[i], hookData)) { methodDefs.RemoveAt(i--); } } if (methodDefs.Count > 1) { System.Text.StringBuilder hooks = new System.Text.StringBuilder("Could not determine which function to hook:\n"); foreach (MethodDefinition md in methodDefs) { hooks.Append($"{className}.{md.Name}("); if (md.Parameters.Count > 0) { hooks.Append(md.Parameters[0].ParameterType.Name); for (int i = 1; i < md.Parameters.Count; i++) { hooks.Append($", {md.Parameters[i].ParameterType.Name}"); } } hooks.Append(")\n"); } Externs.MessageBox("Ambiguous hook!", hooks.ToString()); } if (methodDefs.Count > 0) { methodDef = methodDefs[0]; } return(methodDef); }
private static void ModDomain_UnhandledException(object sender, UnhandledExceptionEventArgs ex) { string caption = "Error in " + Assembly.GetExecutingAssembly().GetName(); Externs.MessageBox(caption, ex.ExceptionObject.ToString()); }