Ejemplo n.º 1
0
        /// <summary>
        /// 使用指定的扩展构建器生成扩展实现
        /// </summary>
        /// <param name="name">扩展名</param>
        /// <returns>扩展实现</returns>
        protected virtual TInterface MakeExtend(string name)
        {
            var extend = GetExtend(name)();

            OnResolving?.Invoke(extend);
            OnAfterResolving?.Invoke(extend);

            return(extend);
        }
        /// <summary>
        /// Resolves a package from nuget using a specified name and version.
        /// </summary>
        /// <param name="name">Name of the package to find</param>
        /// <param name="version">Version of the package</param>
        /// <returns>File path if the nuget package is found</returns>
        protected string ResolvePackage(string name, Version version)
        {
            var args = new NugetAssemblyResolvingEventArgs()
            {
                Name    = name,
                Version = version
            };

            OnResolving?.Invoke(this, args);

            if (!String.IsNullOrWhiteSpace(args.FileLocation))
            {
                return(args.FileLocation);
            }

            // search locally
            foreach (var file in Directory.EnumerateFiles(Environment.CurrentDirectory, name + ".*"))
            {
                var extension = Path.GetExtension(file).ToLower();
                if (new[] { ".exe", ".dll" }.Contains(extension))
                {
                    Console.WriteLine($" * Found {name} locally");
                    return(file);
                }
            }

            // remote search
            SemanticVersion vers    = SemanticVersion.ParseOptionalVersion($"{version.Major}.{version.Minor}.*");
            IPackage        package = ResolvePackage(name, vers);

            if (package != null)
            {
                string installPath = packageManager.PathResolver.GetInstallPath(package);
                string libPath     = Path.Combine(installPath, "lib", "net45", name + ".dll");

                if (File.Exists(libPath))
                {
                    OnResolved?.Invoke(this, new NugetAssemblyResolvedEventArgs()
                    {
                        FilePath = libPath
                    });
                    return(libPath);
                }
                else
                {
                    var files = Directory.EnumerateFiles(installPath, "*.dll", SearchOption.AllDirectories);
                    if (files.Count() == 1)
                    {
                        libPath = files.Single();
                        OnResolved?.Invoke(this, new NugetAssemblyResolvedEventArgs()
                        {
                            FilePath = libPath
                        });
                        return(libPath);
                    }
                }
            }
            //else
            //{
            //}

            return(null);
        }