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<MethodBase> ___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--);
|
|
}
|
|
}
|
|
}
|
|
}
|