mirror of
https://github.com/BepInEx/BepInEx.git
synced 2026-10-19 15:51:45 +00:00
77 lines
2.4 KiB
C#
77 lines
2.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using BepInEx.Logging;
|
|
using HarmonyLib;
|
|
|
|
namespace BepInEx.NET.Framework.Launcher.RuntimeFixes;
|
|
|
|
internal class AssemblyFixes
|
|
{
|
|
private static Assembly EntryAssembly { get; set; }
|
|
|
|
public static Dictionary<string, string> AssemblyLocations { get; } =
|
|
new(StringComparer.InvariantCultureIgnoreCase);
|
|
|
|
public static void Execute(Assembly entryAssembly)
|
|
{
|
|
EntryAssembly = entryAssembly;
|
|
Harmony.CreateAndPatchAll(typeof(AssemblyFixes), "io.bepinex.assemblyfix");
|
|
}
|
|
|
|
[HarmonyPrefix]
|
|
[HarmonyPatch(typeof(Assembly), nameof(Assembly.GetEntryAssembly))]
|
|
public static bool GetEntryAssemblyPrefix(ref Assembly __result)
|
|
{
|
|
Logger.Log(LogLevel.Debug, "Ran GetEntryAssembly");
|
|
|
|
__result = EntryAssembly;
|
|
return false;
|
|
}
|
|
|
|
[HarmonyPrefix]
|
|
[HarmonyPatch(typeof(Assembly), nameof(Assembly.Load), typeof(string))]
|
|
public static bool LoadByName(ref Assembly __result, string assemblyString)
|
|
{
|
|
__result = AppDomain.CurrentDomain.GetAssemblies()
|
|
.FirstOrDefault(x => x.GetName().FullName == assemblyString);
|
|
|
|
|
|
Logger.Log(LogLevel.Debug, $"LoadByName: {assemblyString} : {__result != null}");
|
|
|
|
return __result != null;
|
|
}
|
|
|
|
[HarmonyPrefix]
|
|
[HarmonyPatch("System.Reflection.RuntimeAssembly", nameof(Assembly.Location), MethodType.Getter)]
|
|
public static bool GetLocation(ref string __result, Assembly __instance)
|
|
{
|
|
Logger.Log(LogLevel.Debug, $"GetLocation: {__instance.FullName}");
|
|
|
|
if (AssemblyLocations.TryGetValue(__instance.FullName, out var location))
|
|
{
|
|
__result = location;
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
// This is commented out because it should be implemented alongside GetLocation, but seems to crash the runtime
|
|
// Might be because the target type should be System.Reflection.RuntimeAssembly
|
|
|
|
//[HarmonyPrefix]
|
|
//[HarmonyPatch(typeof(Assembly), nameof(Assembly.CodeBase), MethodType.Getter)]
|
|
//public static bool GetCodeBase(ref string __result, Assembly __instance)
|
|
//{
|
|
// if (AssemblyLocations.TryGetValue(__instance.FullName, out var location))
|
|
// {
|
|
// __result = $"file://{location.Replace('\\', '/')}";
|
|
// return false;
|
|
// }
|
|
|
|
// return true;
|
|
//}
|
|
}
|