public Assembly AssemblyResolveHandler(object sender, ResolveEventArgs args) { if (Plugin == null) { RemoveDependencyResolver(); return(null); } var assemblyDetails = args.Name.Split(", ".ToArray(), StringSplitOptions.RemoveEmptyEntries); var file = assemblyDetails.First(); var version = assemblyDetails.FirstOrDefault(ad => ad.StartsWith("Version="))? .Split("=".ToArray(), StringSplitOptions.RemoveEmptyEntries) .Skip(1)?.First(); var key = $"{file}_{version}"; _Waiter.Wait(key); if (_AssemblyResolveCache.Cache.TryGetValue(key, out IAssembly cachedAssembly)) { _Waiter.InProgress[key] = false; return(cachedAssembly.Instance); } var paths = GetPathsToSearch(Paths, args, key); if (paths == null || !paths.Any()) { _Waiter.InProgress[key] = false; return(null); } foreach (var path in paths) { _AttemptedPaths[args.Name].Add(path); if (!Directory.Exists(path)) { Paths.Remove(path); _Waiter.InProgress[key] = false; continue; } var dll = System.IO.Path.Combine(path, file + ".dll"); var pdb = System.IO.Path.Combine(path, file + ".pdb"); var assembly = (string.IsNullOrWhiteSpace(version)) ? _AssemblyLoader.TryLoad(dll, pdb) : _AssemblyLoader.TryLoad(dll, pdb, version); if (assembly != null) { _Waiter.InProgress[key] = false; _AssemblyResolveCache.Cache.TryAdd(key, assembly); return(assembly.Instance); } } _Waiter.InProgress[key] = false; return(null); }