aliser
aliser
CC#
Created by aliser on 2/22/2025 in #help
Loading DLLs with same names
managed to solve this by using AssemblyLoadContext and manually loading dependencies. something like this:
c#
ModAssemblyLoadContext assemblyLoadCtx = new ModAssemblyLoadContext();
assemblyLoadCtx.LoadFromAssemblyPath(dllAbsPath);
assemblyLoadCtx.Resolving += ModAssemblyLoadContext.ResolveDependencies;
assembly = ModAssemblyLoadContext.GetMainAssembly(assemblyLoadCtx);
c#
ModAssemblyLoadContext assemblyLoadCtx = new ModAssemblyLoadContext();
assemblyLoadCtx.LoadFromAssemblyPath(dllAbsPath);
assemblyLoadCtx.Resolving += ModAssemblyLoadContext.ResolveDependencies;
assembly = ModAssemblyLoadContext.GetMainAssembly(assemblyLoadCtx);
c#
class ModAssemblyLoadContext : AssemblyLoadContext {
public ModAssemblyLoadContext()
: base("ModAssemblyLoadContext") { }

/// <summary>
/// Returns the main assembly.
/// </summary>
public static Assembly GetMainAssembly(AssemblyLoadContext ctx) {
Assembly? mainAssembly = ctx.Assemblies.FirstOrDefault();
if(mainAssembly == null) {
throw new NullReferenceException("Failed to extract the main assembly");
}

return mainAssembly;
}

/// <summary>
/// Resolves dependencies for a given assembly.
/// </summary>
public static Assembly? ResolveDependencies(AssemblyLoadContext ctx, AssemblyName depAssemblyName) {
string depAssemblyFilename = depAssemblyName.Name + ".dll";

Assembly mainAssembly = GetMainAssembly(ctx);
string mainAssemblyLoadedFrom = Path.GetDirectoryName(mainAssembly.Location);

string depAssemblyPathAlongMainAssembly = Path.Combine(mainAssemblyLoadedFrom, depAssemblyFilename);
if(File.Exists(depAssemblyPathAlongMainAssembly)) {
return Assembly.LoadFrom(depAssemblyPathAlongMainAssembly);
}

return null;
}
}
c#
class ModAssemblyLoadContext : AssemblyLoadContext {
public ModAssemblyLoadContext()
: base("ModAssemblyLoadContext") { }

/// <summary>
/// Returns the main assembly.
/// </summary>
public static Assembly GetMainAssembly(AssemblyLoadContext ctx) {
Assembly? mainAssembly = ctx.Assemblies.FirstOrDefault();
if(mainAssembly == null) {
throw new NullReferenceException("Failed to extract the main assembly");
}

return mainAssembly;
}

/// <summary>
/// Resolves dependencies for a given assembly.
/// </summary>
public static Assembly? ResolveDependencies(AssemblyLoadContext ctx, AssemblyName depAssemblyName) {
string depAssemblyFilename = depAssemblyName.Name + ".dll";

Assembly mainAssembly = GetMainAssembly(ctx);
string mainAssemblyLoadedFrom = Path.GetDirectoryName(mainAssembly.Location);

string depAssemblyPathAlongMainAssembly = Path.Combine(mainAssemblyLoadedFrom, depAssemblyFilename);
if(File.Exists(depAssemblyPathAlongMainAssembly)) {
return Assembly.LoadFrom(depAssemblyPathAlongMainAssembly);
}

return null;
}
}
10 replies
CC#
Created by aliser on 2/22/2025 in #help
Loading DLLs with same names
makes sense this wouldn't solve the problem with dependencies though? if a mod decides to use some library, it would be a dependency shipped with the mod and still wouldn't load, resulting in an error.
10 replies