Files
7d2dXG/Mods/0A-KFCommonUtilityLib/Scripts/StaticManagers/DelayLoadModuleManager.cs
Nathaniel Cosford 062dfab2cd Patched
2025-05-30 01:04:40 +09:30

96 lines
4.2 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using UniLinq;
namespace KFCommonUtilityLib.Scripts.StaticManagers
{
public static class DelayLoadModuleManager
{
private static readonly List<(string mod, List<string> dlls)> list_delay_load = new List<(string mod, List<string> dlls)>();
private static readonly List<Assembly> loaded = new List<Assembly>();
public static void RegisterDelayloadDll(string modName, string dllNameWithoutExtension)
{
List<string> dlls;
int index = list_delay_load.FindIndex(p => p.mod == modName);
if (index < 0)
{
dlls = new List<string>() { dllNameWithoutExtension };
list_delay_load.Add((modName, dlls));
return;
}
dlls = list_delay_load[index].dlls;
dlls.Add(dllNameWithoutExtension);
}
public static void DelayLoad()
{
Assembly assembly = Assembly.GetAssembly(typeof(DelayLoadModuleManager));
Mod mod = ModManager.GetModForAssembly(assembly);
string delayLoadFolder = mod.Path + "/DelayLoad";
ModuleManagers.AddAssemblySearchPath(delayLoadFolder);
foreach (var pair in list_delay_load)
{
if (ModManager.GetLoadedAssemblies().Any(a => a.GetName().Name == pair.mod))
{
foreach (var dll in pair.dlls)
{
try
{
string assPath = Path.GetFullPath(delayLoadFolder + $"/{dll}.dll");
Assembly patch = Assembly.LoadFrom(assPath);
if (Path.GetFullPath(patch.Location).Equals(assPath, StringComparison.OrdinalIgnoreCase))
{
foreach (var type in patch.GetTypes())
{
if (typeof(IModApi).IsAssignableFrom(type))
{
IModApi modApi = (IModApi)Activator.CreateInstance(type);
modApi.InitMod(mod);
Log.Out(string.Concat($"[DELAYLOAD] Initialized code in {dll}.dll"));
}
}
mod.allAssemblies.Add(patch);
}
}
catch (Exception ex)
{
Log.Error($"[DELAYLOAD] Failed loading DLL {dll}.dll");
Log.Exception(ex);
}
}
}
}
//if (ModManager.GetLoadedAssemblies().FirstOrDefault(a => a.GetName().Name == "FullautoLauncher") != null)
//{
// try
// {
// string assPath = Path.GetFullPath(delayLoadFolder + "/FullautoLauncherAnimationRiggingCompatibilityPatch.dll");
// Assembly patch = Assembly.LoadFrom(assPath);
// if (Path.GetFullPath(patch.Location).Equals(assPath, StringComparison.OrdinalIgnoreCase))
// {
// Type apiType = typeof(IModApi);
// foreach (var type in patch.GetTypes())
// {
// if (apiType.IsAssignableFrom(type))
// {
// IModApi modApi = (IModApi)Activator.CreateInstance(type);
// modApi.InitMod(mod);
// Log.Out(string.Concat("[DELAYLOAD] Initialized code in FullautoLauncherAnimationRiggingCompatibilityPatch.dll"));
// }
// }
// }
// }
// catch (Exception ex)
// {
// Log.Error("[DELAYLOAD] Failed loading DLL FullautoLauncherAnimationRiggingCompatibilityPatch.dll");
// Log.Exception(ex);
// }
//}
}
}
}