コード例 #1
0
        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);
        }