private static void PatchInternalMethodFull(MethodInfo method, bool display = true) { try { AnalyzerState.MakeAndSwitchTab(method.Name + "-int"); InternalMethodUtility.curMeth = method; InternalMethodUtility.PatchedInternals.Add(method); InternalMethodUtility.Harmony.Patch(method, null, null, InternalMethodUtility.InternalProfiler); } catch (Exception e) { if (display) { Error("Failed to patch internal methods, failed with the error " + e.Message); } InternalMethodUtility.PatchedInternals.Remove(method); } }
public static void PatchAssembly(string name, bool display = true) { var mod = LoadedModManager.RunningMods.FirstOrDefault(m => m.Name == name || m.PackageId == name.ToLower()); if (display) { Notify($"Mod is null? {mod == null}"); } if (mod != null) { if (display) { Notify($"Assembly count: { mod.assemblies?.loadedAssemblies?.Count ?? 0}"); } foreach (var ass in mod.assemblies?.loadedAssemblies) { if (display) { Notify($"Assembly named: {ass.FullName}, located at {ass.Location}"); } } } var assembly = mod?.assemblies?.loadedAssemblies?.Where(w => !w.FullName.Contains("Harmony") && !w.FullName.Contains("0MultiplayerAPI")); if (assembly != null && assembly.Count() != 0) { AnalyzerState.MakeAndSwitchTab(mod.Name + "-prof"); var pre = new HarmonyMethod(AccessTools.TypeByName(mod.Name + "-prof").GetMethod("Prefix", BindingFlags.Public | BindingFlags.Static)); var post = new HarmonyMethod(AccessTools.TypeByName(mod.Name + "-prof").GetMethod("Postfix", BindingFlags.Public | BindingFlags.Static)); patchAssemblyThread = new Thread(() => PatchAssemblyFull(assembly.ToList(), pre, post, display)); patchAssemblyThread.Start(); } else { if (display) { Error($"Failed to patch {name}"); } } }