|
|
- using HarmonyLib;
- using System.Reflection;
-
- namespace IPA.Loader
- {
- internal static class HarmonyProtectorProxy
- {
- public static void ProtectNull() => HarmonyProtector.Protect();
- }
-
- internal static class HarmonyProtector
- {
- private static Harmony instance;
- private static Assembly selfAssem;
- private static Assembly harmonyAssem;
-
- public static void Protect(Harmony inst = null)
- {
- HarmonyGlobalSettings.DisallowLegacyGlobalUnpatchAll = true;
-
- selfAssem = Assembly.GetExecutingAssembly();
- harmonyAssem = typeof(Harmony).Assembly;
-
- if (inst == null)
- {
- if (instance == null)
- instance = new Harmony("BSIPA Safeguard");
-
- inst = instance;
- }
-
- var target = typeof(PatchProcessor).GetMethod("Patch");
- var patch = typeof(HarmonyProtector).GetMethod(nameof(PatchProcessor_Patch_Prefix), BindingFlags.NonPublic | BindingFlags.Static);
-
- inst.Patch(target, new HarmonyMethod(patch));
- }
-
- private static bool PatchProcessor_Patch_Prefix(MethodBase ___original, out MethodInfo __result)
- {
- var asm = ___original.DeclaringType.Assembly;
-
- __result = ___original as MethodInfo;
- return !(asm.Equals(selfAssem) || asm.Equals(harmonyAssem));
- }
- }
- }
|