private static FrameworkName[] SupportedFrameworks(PackageArchiveReaderWithRef packageReader) { var netstandardFrameworks = new HashSet <FrameworkName>(EqualityComparerBuilder.For <FrameworkName>().EquateBy(x => x.FullName, StringComparer.InvariantCultureIgnoreCase)); foreach (var target in packageReader.GetSupportedFrameworksWithRef() .Select(x => new FrameworkName(x.DotNetFrameworkName)) .Where(x => x.IsNetStandard())) { netstandardFrameworks.Add(target); } var supportedFrameworks = netstandardFrameworks.OrderBy(x => x.Version).ToArray(); return(supportedFrameworks); }
private static IEnumerable <PackageDocument> GenerateDocuments(IndexPackageRequest request, TextWriter log) { var namespaces = new HashSet <string>(); var types = new HashSet <string>(); var nuget = PackageRepositoryFactory.Default.CreateRepository("https://packages.nuget.org/api/v2"); var packageDownloadPolicy = Policy.HandleResult((IPackage)null).WaitAndRetry(10, _ => TimeSpan.FromMinutes(1)); var package = packageDownloadPolicy.Execute(() => nuget.FindPackage(request.PackageId, SemanticVersion.Parse(request.PackageVersion), true, false)); if (package == null) { log.WriteLine("Package download failed for " + request); throw new InvalidOperationException("Package download failed for " + request); } var packageStream = package.GetStream(); var packageReader = new PackageArchiveReaderWithRef(packageStream, leaveStreamOpen: true); foreach (var framework in SupportedFrameworks(packageReader)) { var netstandardVersion = framework.Version.Major * 256 + framework.Version.Minor; var current = new PackageDocument { Id = AzureSearchUtilities.EncodeDocumentKey(request.PackageId + "$" + (request.PackageVersion.Contains('-') ? 1 : 0) + "$" + netstandardVersion.ToString("X4")), PackageId = request.PackageId, PackageVersion = request.PackageVersion, Prerelease = request.PackageVersion.Contains('-'), Published = package.Published.Value, TotalDownloadCount = package.DownloadCount, NetstandardVersion = netstandardVersion, }; foreach (var path in packageReader.GetCompatibleAssemblyReferences(framework).Where(x => x.EndsWith(".dll"))) { var dllStream = new MemoryStream(); packageReader.GetStream(path).CopyTo(dllStream); dllStream.Position = 0; var readerParameters = new ReaderParameters { AssemblyResolver = new NullAssemblyResolver(log), }; var assembly = AssemblyDefinition.ReadAssembly(dllStream, readerParameters); foreach (var type in assembly.Modules.SelectMany(x => x.Types).Where(x => x.IsPublic)) { if (!namespaces.Contains(type.Namespace)) { namespaces.Add(type.Namespace); current.Namespaces.Add(type.Namespace); } var name = type.Namespace + "." + type.TypeName(); if (!types.Contains(name)) { types.Add(name); current.Types.Add(name); current.TypesCamelHump.Add(type.TypeName()); } } } yield return(current); } }