From 9cce4e4222008af69247cd1e8d91dc828fa618dd Mon Sep 17 00:00:00 2001 From: ghorsington Date: Mon, 19 Oct 2020 13:09:33 +0300 Subject: [PATCH] Allow multiple versions of an assembly to be loaded into AppDomain --- BepInEx.Preloader/Entrypoint.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/BepInEx.Preloader/Entrypoint.cs b/BepInEx.Preloader/Entrypoint.cs index f9ce482..8c9d473 100644 --- a/BepInEx.Preloader/Entrypoint.cs +++ b/BepInEx.Preloader/Entrypoint.cs @@ -40,8 +40,17 @@ namespace BepInEx.Preloader // Use parse assembly name on managed side because native GetName() can fail on some locales // if the game path has "exotic" characters - var foundAssembly = AppDomain.CurrentDomain.GetAssemblies() - .FirstOrDefault(x => Utility.TryParseAssemblyName(x.FullName, out var name) && name.Name == assemblyName.Name); + var validAssemblies = AppDomain.CurrentDomain + .GetAssemblies() + .Select(a => new { assembly = a, name = Utility.TryParseAssemblyName(a.FullName, out var name) ? name : null }) + .Where(a => a.name != null && a.name.Name == assemblyName.Name) + .OrderByDescending(a => a.name.Version) + .ToList(); + + // First try to match by version, then just pick the best match (generally highest) + // This should mainly affect cases where the game itself loads some assembly (like Mono.Cecil) + var foundMatch = validAssemblies.FirstOrDefault(a => a.name.Version == assemblyName.Version) ?? validAssemblies.FirstOrDefault(); + var foundAssembly = foundMatch?.assembly; if (foundAssembly != null) return foundAssembly;