public ImmutableArray <ObjectListItem> GetProjectListItems(Solution solution, string languageName, uint listFlags, CancellationToken cancellationToken) { var projectIds = solution.ProjectIds; if (!projectIds.Any()) { return(ImmutableArray <ObjectListItem> .Empty); } var projectListItemBuilder = ImmutableArray.CreateBuilder <ObjectListItem>(); var referenceListItemBuilder = ImmutableArray.CreateBuilder <ObjectListItem>(); HashSet <AssemblyIdentity> assemblyIdentitySet = null; foreach (var projectId in projectIds) { var project = solution.GetProject(projectId); if (project.Language != languageName) { continue; } if (project.IsVenus()) { continue; } projectListItemBuilder.Add(new ProjectListItem(project)); if (Helpers.IsObjectBrowser(listFlags)) { if (assemblyIdentitySet == null) { assemblyIdentitySet = new HashSet <AssemblyIdentity>(); } foreach (var reference in project.MetadataReferences) { var portableExecutableReference = reference as PortableExecutableReference; if (portableExecutableReference != null) { var assemblyIdentity = AssemblyIdentityUtils.TryGetAssemblyIdentity(portableExecutableReference.FilePath); if (assemblyIdentity != null && !assemblyIdentitySet.Contains(assemblyIdentity)) { assemblyIdentitySet.Add(assemblyIdentity); var referenceListItem = new ReferenceListItem(projectId, assemblyIdentity.Name, reference); referenceListItemBuilder.Add(referenceListItem); } } } } } projectListItemBuilder.AddRange(referenceListItemBuilder); return(projectListItemBuilder.ToImmutable()); }
private AssemblyIdentity GetOrAddAssemblyIdentity(string fullPath) { Debug.Assert(PathUtilities.IsAbsolute(fullPath)); lock (_guard) { if (_loadedAssemblyIdentitiesByPath.TryGetValue(fullPath, out var existingIdentity)) { return(existingIdentity); } } var identity = AssemblyIdentityUtils.TryGetAssemblyIdentity(fullPath); return(AddToCache(fullPath, identity)); }
protected override bool TryGetBrowseContainerData(uint index, ref VSCOMPONENTSELECTORDATA data) { var listItem = GetListItem(index); var projectListItem = listItem as ProjectListItem; if (projectListItem != null) { var hierarchy = this.LibraryManager.Workspace.GetHierarchy(projectListItem.ProjectId); if (hierarchy == null) { return(false); } var vsSolution = this.LibraryManager.ServiceProvider.GetService(typeof(SVsSolution)) as IVsSolution; if (vsSolution == null) { return(false); } if (ErrorHandler.Failed(vsSolution.GetProjrefOfProject(hierarchy, out var projectRef))) { return(false); } var project = this.LibraryManager.Workspace.CurrentSolution.GetProject(projectListItem.ProjectId); if (project == null) { return(false); } data.bstrFile = project.FilePath; data.bstrProjRef = projectRef; data.bstrTitle = projectListItem.DisplayText; data.type = VSCOMPONENTTYPE.VSCOMPONENTTYPE_Project; } else { var referenceListItem = listItem as ReferenceListItem; if (referenceListItem == null) { return(false); } var portableExecutableReference = referenceListItem.MetadataReference as PortableExecutableReference; if (portableExecutableReference == null) { return(false); } var assemblyIdentity = AssemblyIdentityUtils.TryGetAssemblyIdentity(portableExecutableReference.FilePath); if (assemblyIdentity == null) { return(false); } data.bstrFile = portableExecutableReference.FilePath; data.type = VSCOMPONENTTYPE.VSCOMPONENTTYPE_ComPlus; data.wFileMajorVersion = (ushort)assemblyIdentity.Version.Major; data.wFileMinorVersion = (ushort)assemblyIdentity.Version.Minor; data.wFileBuildNumber = (ushort)assemblyIdentity.Version.Build; data.wFileRevisionNumber = (ushort)assemblyIdentity.Version.Revision; } return(true); }