explicitly resolve unmanaged assemblies in the game context because the runtime doesnt always resolve them in the game directory
All checks were successful
Build / Compute Version (push) Successful in 5s
Build / Build Nuget package (CringeBootstrap.Abstractions) (push) Successful in 48s
Build / Build Nuget package (SharedCringe) (push) Successful in 49s
Build / Build Nuget package (CringePlugins) (push) Successful in 1m2s
Build / Build Launcher (push) Successful in 1m35s
Build / Build Nuget package (NuGet) (push) Successful in 3m40s
All checks were successful
Build / Compute Version (push) Successful in 5s
Build / Build Nuget package (CringeBootstrap.Abstractions) (push) Successful in 48s
Build / Build Nuget package (SharedCringe) (push) Successful in 49s
Build / Build Nuget package (CringePlugins) (push) Successful in 1m2s
Build / Build Launcher (push) Successful in 1m35s
Build / Build Nuget package (NuGet) (push) Successful in 3m40s
This commit is contained in:
@@ -8,11 +8,13 @@ namespace CringeBootstrap;
|
||||
|
||||
public class GameDirectoryAssemblyLoadContext : AssemblyLoadContext, ICoreLoadContext
|
||||
{
|
||||
private readonly string _dir;
|
||||
private static readonly ImmutableHashSet<string> ReferenceAssemblies = ["netstandard"];
|
||||
private readonly Dictionary<string, string> _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<string> 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);
|
||||
}
|
Reference in New Issue
Block a user