예제 #1
0
        public static void DownloadPackageFromNuGet(string assemblyPath, string nuGetPackageId, string version)
        {
            if (string.IsNullOrEmpty(nuGetPackageId))
            {
                throw new NotSupportedException("This connector does not support downloading package from NuGet!");
            }

            var tempFolder = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
            var assembly   = StiAssemblyFinder.GetAssembly("NuGet.Core.dll");

            //var repository = PackageRepositoryFactory.Default.CreateRepository("https://packages.nuget.org/api/v2");
            var typePackageRepositoryFactory = assembly.GetType("NuGet.PackageRepositoryFactory");
            var valueDefault = typePackageRepositoryFactory.GetProperty("Default").GetValue(null, null);
            var repository   = Reflection.InvokeMethod(valueDefault, "CreateRepository", "https://packages.nuget.org/api/v2");


            //var packages = repository.FindPackagesById(NuGetPackageId).Where(item => item.IsReleaseVersion()).ToList();
            var packagesList = Reflection.InvokeMethod(repository, "FindPackagesById", nuGetPackageId) as IEnumerable;

            //var repo = PackageRepositoryFactory.Default.CreateRepository("https://packages.nuget.org/api/v2");
            //var packages = repo.FindPackagesById(NuGetPackageId).Where(item => item.IsReleaseVersion()).ToList();

            object packageRequired       = null;
            var    typePackageExtensions = assembly.GetType("NuGet.PackageExtensions");

            foreach (var item in packagesList)
            {
                var propVersion = item.GetType().GetProperty("Version");

                var versionValue = (string)propVersion.GetValue(item, null);
                if (versionValue == version)
                {
                    packageRequired = item;
                    break;
                }
            }

            if (packageRequired != null)
            {
                //var packageManager = new PackageManager(repository, tempFolder);
                var packageManager = Reflection.Create(assembly, "NuGet.PackageManager", repository, tempFolder);

                //packageManager.InstallPackage(packageRequired, true, false);
                Reflection.InvokeMethod(packageManager, "InstallPackage", packageRequired, true, false);

                //var allLibs = packageRequired2.GetLibFiles().ToList();
                var methodGetLibFiles = typePackageExtensions.GetMethod("GetLibFiles");
                var allLibs           = methodGetLibFiles.Invoke(null, new[] { packageRequired }) as IEnumerable;
                var libs = new List <object>();

                foreach (var lib in allLibs)
                {
                    var propTargetFramework = Reflection.GetPropertyValue(lib, "TargetFramework");
                    if (propTargetFramework == null)
                    {
                        continue;
                    }

                    var propVersion = Reflection.GetPropertyValue(propTargetFramework, "Version") as Version;
                    if (propVersion == null || propVersion != Version.Parse("4.0"))
                    {
                        continue;
                    }

                    libs.Add(lib);
                }

                if (libs.Count == 0)
                {
                    libs.AddRange(allLibs.Cast <object>());
                }

                foreach (var lib in libs)
                {
                    var packageId        = Reflection.GetPropertyValue(packageRequired, "Id");      //packageRequired.Id
                    var packageVersion   = Reflection.GetPropertyValue(packageRequired, "Version"); //packageRequired.Version
                    var libPath          = Reflection.GetPropertyValue(lib, "Path");                //lib.Path
                    var libEffectivePath = Reflection.GetPropertyValue(lib, "EffectivePath");       //lib.EffectivePath

                    if (packageId == null || packageVersion == null || libPath == null || libEffectivePath == null)
                    {
                        continue;
                    }

                    var packageIdStr        = packageId.ToString();
                    var packageVersionStr   = packageVersion.ToString();
                    var libPathStr          = libPath.ToString();
                    var libEffectivePathStr = libEffectivePath.ToString();

                    var filePath         = Path.Combine(tempFolder, string.Format("{0}.{1}", packageIdStr, packageVersionStr), libPathStr);
                    var assemblyFileName = Path.Combine(assemblyPath, Path.GetFileName(libEffectivePathStr));

                    var excludedFiles = new List <string>
                    {
                        "db2dascmn64.dll",
                        "db2g11n64.dll",
                        "db2genreg64.dll",
                        "db2install64.dll",
                        "db2locale64.dll",
                        "db2osse64.dll",
                        "db2osse_db364.dll",
                        "db2sdbin64.dll",
                        "db2sys64.dll",
                        "db2trcapi64.dll",
                        "db2wint64.dll",
                        "ibm.data.db2.asp.dll",
                        "ibm.data.db2.entity.dll",
                        "npgsql.resources.dll"
                    };

                    if (Path.GetExtension(assemblyFileName).ToLowerInvariant() == ".dll" && !excludedFiles.Exists(item => item == Path.GetFileName(assemblyFileName).ToLowerInvariant()))
                    {
                        File.Copy(filePath, assemblyFileName, true);
                    }
                }
            }

            Directory.Delete(tempFolder, true);
        }
예제 #2
0
        public static List <StiNuGetPackageInfo> GetPackageInfoFromNuGet(string packageId)
        {
            if (string.IsNullOrEmpty(packageId))
            {
                throw new NotSupportedException("This connector does not support downloading package from NuGet!");
            }

            var tempFolder = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
            var assembly   = StiAssemblyFinder.GetAssembly("NuGet.Core.dll");

            var typePackageRepositoryFactory = assembly.GetType("NuGet.PackageRepositoryFactory");
            var valueDefault = typePackageRepositoryFactory.GetProperty("Default").GetValue(null, null);
            var repository   = Reflection.InvokeMethod(valueDefault, "CreateRepository", "https://packages.nuget.org/api/v2");


            var packagesList = Reflection.InvokeMethod(repository, "FindPackagesById", packageId) as IEnumerable;

            var packages = new List <object>();
            var typePackageExtensions = assembly.GetType("NuGet.PackageExtensions");

            var result = new List <StiNuGetPackageInfo>();

            foreach (var item in packagesList)
            {
                var    type    = item.GetType();
                string version = type.GetProperty("Version").GetValue(item, null) as string;

                if (packageId == "mongocsharpdriver" && version != "1.10.1")
                {
                    continue;
                }

                var info = new StiNuGetPackageInfo
                {
                    IconUrl         = type.GetProperty("IconUrl").GetValue(item, null) as Uri,
                    Title           = type.GetProperty("Title").GetValue(item, null) as string,
                    Description     = type.GetProperty("Description").GetValue(item, null) as string,
                    Authors         = type.GetProperty("Authors").GetValue(item, null) as string,
                    LicenseUrl      = type.GetProperty("LicenseUrl").GetValue(item, null) as Uri,
                    DownloadCount   = (int)type.GetProperty("DownloadCount").GetValue(item, null),
                    ProjectUrl      = type.GetProperty("ProjectUrl").GetValue(item, null) as Uri,
                    ReportAbuseUrl  = type.GetProperty("ReportAbuseUrl").GetValue(item, null) as Uri,
                    Tags            = type.GetProperty("Tags").GetValue(item, null) as string,
                    Version         = version,
                    IsLatestVersion = (bool)type.GetProperty("IsLatestVersion").GetValue(item, null),
                    Dependencies    = type.GetProperty("Dependencies").GetValue(item, null) as string,
                };

                var dependencySets = type.GetProperty("DependencySets").GetValue(item, null) as IEnumerable;
                if (dependencySets != null)
                {
                    foreach (var dependencySet in dependencySets)
                    {
                        var dependencies = dependencySet.GetType().GetProperty("Dependencies").GetValue(dependencySet, null) as IEnumerable;
                        if (dependencies != null)
                        {
                            foreach (var dep in dependencies)
                            {
                                var packageDependencySet = new StiPackageDependency
                                {
                                    ID          = dep.GetType().GetProperty("Id").GetValue(dep, null) as string,
                                    VersionSpec = dep.GetType().GetProperty("VersionSpec").GetValue(dep, null).ToString()
                                };

                                info.DependencySets.Add(packageDependencySet);
                            }
                        }
                    }
                }

                result.Add(info);
            }

            // Сортируем по версии, начиная с последней
            return(result.OrderByDescending(x => x.Version).ToList());
        }