using Harmony; using System.Collections.Generic; using System.Reflection; namespace IPA.Loader { internal static class HarmonyProtectorProxy { public static void ProtectNull() => HarmonyProtector.Protect(); } internal static class HarmonyProtector { private static HarmonyInstance instance; private static Assembly selfAssem; private static Assembly harmonyAssem; public static void Protect(HarmonyInstance inst = null) { selfAssem = Assembly.GetExecutingAssembly(); harmonyAssem = typeof(HarmonyInstance).Assembly; if (inst == null) { if (instance == null) instance = HarmonyInstance.Create("BSIPA Safeguard"); inst = instance; } var target = typeof(PatchProcessor).GetMethod("Patch"); var patch = typeof(HarmonyProtector).GetMethod(nameof(PatchProcessor_Patch_Prefix)); inst.Patch(target, new HarmonyMethod(patch)); } private static void PatchProcessor_Patch_Prefix(ref List ___originals) { for (int i = 0; i < ___originals.Count; i++) { var mi = ___originals[i]; var asm = mi.DeclaringType.Assembly; if (asm.Equals(selfAssem) || asm.Equals(harmonyAssem)) ___originals.RemoveAt(i--); } } } }