public static async Task LoadPackage(string packageId, string packageVersion, HashSet <string> buildReferences, HashSet <string> runtimeReferences) { Console.WriteLine($"Loading package '{packageId} ({packageVersion})'..."); var version = NuGetVersion.Parse(packageVersion); var nuGetFramework = NuGetFramework.ParseFrameworkName(AppDomain.CurrentDomain.SetupInformation.TargetFrameworkName, DefaultFrameworkNameProvider.Instance); var settings = Settings.LoadDefaultSettings(null); var sourceRepositoryProvider = new SourceRepositoryProvider(new PackageSourceProvider(settings), Repository.Provider.GetCoreV3()); var packagesPath = SettingsUtility.GetGlobalPackagesFolder(settings); var runtimeFramework = NuGetFramework.ParseFolder(BuildInfo.RuntimeIdentifier); using (var cacheContext = new SourceCacheContext()) { var repositories = sourceRepositoryProvider.GetRepositories(); var availablePackages = new HashSet <SourcePackageDependencyInfo>(PackageIdentityComparer.Default); await GetPackageDependencies( new PackageIdentity(packageId, version), nuGetFramework, cacheContext, NullLogger.Instance, repositories, availablePackages); var resolverContext = new PackageResolverContext( DependencyBehavior.Lowest, new[] { packageId }, Enumerable.Empty <string>(), Enumerable.Empty <PackageReference>(), Enumerable.Empty <PackageIdentity>(), availablePackages, sourceRepositoryProvider.GetRepositories().Select(s => s.PackageSource), NullLogger.Instance); var resolver = new PackageResolver(); var packagesToInstall = resolver.Resolve(resolverContext, CancellationToken.None) .Select(p => availablePackages.Single(x => PackageIdentityComparer.Default.Equals(x, p))); var packagePathResolver = new PackagePathResolver(packagesPath, true); var packageExtractionContext = new PackageExtractionContext( PackageSaveMode.Defaultv3, XmlDocFileSaveMode.None, ClientPolicyContext.GetClientPolicy(settings, NullLogger.Instance), NullLogger.Instance); var frameworkReducer = new FrameworkReducer(); foreach (var packageToInstall in packagesToInstall) { var installedPath = packagePathResolver.GetInstalledPath(packageToInstall); if (installedPath == null) { Console.WriteLine($"Installing package '{packageToInstall.Id} ({packageToInstall.Version})'..."); var downloadResource = await packageToInstall.Source.GetResourceAsync <DownloadResource>(CancellationToken.None); var downloadResult = await downloadResource.GetDownloadResourceResultAsync( packageToInstall, new PackageDownloadContext(cacheContext), packagesPath, NullLogger.Instance, CancellationToken.None); await PackageExtractor.ExtractPackageAsync( downloadResult.PackageSource, downloadResult.PackageStream, packagePathResolver, packageExtractionContext, CancellationToken.None); } installedPath = packagePathResolver.GetInstalledPath(packageToInstall); var packageReader = new PackageFolderReader(installedPath); if (buildReferences != null) { var items = await packageReader.GetReferenceItemsAsync(CancellationToken.None); var paths = GetAssemblyPaths(items, frameworkReducer, nuGetFramework, installedPath); buildReferences.AddRange(paths); } if (runtimeReferences != null) { var items = await packageReader.GetItemsAsync("runtimes", CancellationToken.None); var nearest = items.Select(x => x.TargetFramework) .Where(x => x.Framework == runtimeFramework.Framework && (!x.HasProfile || x.Profile == runtimeFramework.Profile)) .OrderBy(x => x.HasProfile ? 1 : -1) .FirstOrDefault(); var runtimeDir = items.FirstOrDefault(x => x.TargetFramework.Equals(nearest))?.Items.FirstOrDefault()?.Split('/').ElementAtOrDefault(1); if (runtimeDir != null) { installedPath = Path.Combine(installedPath, "runtimes", runtimeDir); packageReader = new PackageFolderReader(installedPath); } items = await packageReader.GetLibItemsAsync(CancellationToken.None); var paths = GetAssemblyPaths(items, frameworkReducer, nuGetFramework, installedPath); runtimeReferences.AddRange(paths); } } } }