UnityExplorer/src/Runtime/UERuntimeHelper.cs

93 lines
2.8 KiB
C#
Raw Normal View History

2021-12-02 18:35:46 +11:00
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using UnityExplorer.Config;
2021-12-02 18:35:46 +11:00
using UniverseLib;
namespace UnityExplorer.Runtime
2021-12-02 18:35:46 +11:00
{
2022-01-31 21:24:01 +11:00
// Not really that necessary anymore, can eventually just be refactored away into the few classes that use this class.
public abstract class UERuntimeHelper
2021-12-02 18:35:46 +11:00
{
2022-01-31 21:24:01 +11:00
public static UERuntimeHelper Instance;
2021-12-02 18:35:46 +11:00
public static void Init()
{
#if CPP
2022-01-31 21:24:01 +11:00
Instance = new Il2CppHelper();
2021-12-02 18:35:46 +11:00
#else
2022-01-31 21:24:01 +11:00
Instance = new MonoHelper();
2021-12-02 18:35:46 +11:00
#endif
Instance.SetupEvents();
LoadBlacklistString(ConfigManager.Reflection_Signature_Blacklist.Value);
ConfigManager.Reflection_Signature_Blacklist.OnValueChanged += (string val) =>
{
LoadBlacklistString(val);
};
}
public abstract void SetupEvents();
2022-01-31 21:24:01 +11:00
private static readonly HashSet<string> currentBlacklist = new();
2021-12-02 18:35:46 +11:00
public virtual string[] DefaultReflectionBlacklist => new string[0];
public static void LoadBlacklistString(string blacklist)
{
try
{
if (string.IsNullOrEmpty(blacklist) && !Instance.DefaultReflectionBlacklist.Any())
return;
try
{
var sigs = blacklist.Split(';');
foreach (var sig in sigs)
{
var s = sig.Trim();
if (string.IsNullOrEmpty(s))
continue;
if (!currentBlacklist.Contains(s))
currentBlacklist.Add(s);
}
}
catch (Exception ex)
{
ExplorerCore.LogWarning($"Exception parsing blacklist string: {ex.ReflectionExToString()}");
}
foreach (var sig in Instance.DefaultReflectionBlacklist)
{
if (!currentBlacklist.Contains(sig))
currentBlacklist.Add(sig);
}
Mono.CSharp.IL2CPP.Blacklist.SignatureBlacklist = currentBlacklist;
}
catch (Exception ex)
{
ExplorerCore.LogWarning($"Exception setting up reflection blacklist: {ex.ReflectionExToString()}");
}
}
public static bool IsBlacklisted(MemberInfo member)
{
if (string.IsNullOrEmpty(member.DeclaringType?.Namespace))
return false;
var sig = $"{member.DeclaringType.FullName}.{member.Name}";
return currentBlacklist.Contains(sig);
}
}
}