diff --git a/CringeBootstrap/GameDirectoryAssemblyLoadContext.cs b/CringeBootstrap/GameDirectoryAssemblyLoadContext.cs index 4285072..57e7d26 100644 --- a/CringeBootstrap/GameDirectoryAssemblyLoadContext.cs +++ b/CringeBootstrap/GameDirectoryAssemblyLoadContext.cs @@ -8,11 +8,13 @@ namespace CringeBootstrap; public class GameDirectoryAssemblyLoadContext : AssemblyLoadContext, ICoreLoadContext { + private readonly string _dir; private static readonly ImmutableHashSet ReferenceAssemblies = ["netstandard"]; private readonly Dictionary _assemblyNames = []; public GameDirectoryAssemblyLoadContext(string dir) : base("CringeBootstrap") { + _dir = dir; var files = Directory.GetFiles(dir, "*.dll"); foreach (var file in files) { @@ -62,6 +64,27 @@ public class GameDirectoryAssemblyLoadContext : AssemblyLoadContext, ICoreLoadCo } } + protected override nint LoadUnmanagedDll(string unmanagedDllName) + { + // if specified name is a path, skip to default logic + if (unmanagedDllName.AsSpan().ContainsAny(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)) + return base.LoadUnmanagedDll(unmanagedDllName); + + // prefer System32 over ours + ReadOnlySpan dirs = [Environment.SystemDirectory, _dir]; + foreach (var dir in dirs) + { + var path = Path.Join(dir, unmanagedDllName); + if (!Path.HasExtension(path)) + path += ".dll"; + + if (File.Exists(path)) + return LoadUnmanagedDllFromPath(path); + } + + throw new DllNotFoundException($"Unable to load {unmanagedDllName}, module not found in valid locations"); + } + public Assembly? ResolveFromAssemblyName(AssemblyName assemblyName) => Load(assemblyName); public nint ResolveUnmanagedDll(string unmanagedDllName) => LoadUnmanagedDll(unmanagedDllName); } \ No newline at end of file