/// <summary> /// Update dependency list /// </summary> /// <param name="projectNode">Project node to be updated. If null then all ProjectContainer nodes are updated</param> private void UpdateDependencyListWithSubProjects(IBuildDependencyOnProjectContainer projectNode) { if(projectNode != null) { // Get list of sub projects IList<IVsHierarchy> nestedProjectList = projectNode.EnumNestedHierachiesForBuildDependency(); if(nestedProjectList != null && nestedProjectList.Count > 0) { // Loop nested projects and add project dependency (if supported) foreach(IVsHierarchy nestedProject in nestedProjectList) { AddBuildDependenyToNestedProject(projectNode as IBuildDependencyUpdate, nestedProject); } } } else { // Update all ProjectContainerNode nodes List<IBuildDependencyOnProjectContainer> projectList = this.GetListOfProjectContainerNodes(); if(projectList != null && projectList.Count > 0) { foreach(IBuildDependencyOnProjectContainer project in projectList) { UpdateDependencyListWithSubProjects(project); } } } }
/// <summary> /// Update dependency list /// </summary> /// <param name="projectNode">Project node to be updated. If null then all ProjectContainer nodes are updated</param> private void UpdateDependencyListWithSubProjects(IBuildDependencyOnProjectContainer projectNode) { if (projectNode != null) { // Get list of sub projects IList <IVsHierarchy> nestedProjectList = projectNode.EnumNestedHierachiesForBuildDependency(); if (nestedProjectList != null && nestedProjectList.Count > 0) { // Loop nested projects and add project dependency (if supported) foreach (IVsHierarchy nestedProject in nestedProjectList) { AddBuildDependenyToNestedProject(projectNode as IBuildDependencyUpdate, nestedProject); } } } else { // Update all ProjectContainerNode nodes List <IBuildDependencyOnProjectContainer> projectList = this.GetListOfProjectContainerNodes(); if (projectList != null && projectList.Count > 0) { foreach (IBuildDependencyOnProjectContainer project in projectList) { UpdateDependencyListWithSubProjects(project); } } } }
/// <summary> /// Update build dependency list if solution is fully loaded /// </summary> /// <param name="hierarchy"></param> /// <param name="added"></param> /// <returns></returns> public override int OnAfterOpenProject(IVsHierarchy hierarchy, int added) { // Return from here if we are at load time if (added == 0) { return(VSConstants.S_OK); } IBuildDependencyOnProjectContainer projectNode = hierarchy as IBuildDependencyOnProjectContainer; // We will update only nested project types and the BuildNestedProjectsOnBuild flag is set to true if (projectNode != null) { if (projectNode.BuildNestedProjectsOnBuild) { // Enum all sub projects and add to dependency list UpdateDependencyListWithSubProjects(projectNode); } } return(VSConstants.S_OK); }
/// <summary> /// Enum all projects in the solution and collect all that derives from ProjectContainerNode /// </summary> /// <returns>List of ProjectContainerNode nodes</returns> private List <IBuildDependencyOnProjectContainer> GetListOfProjectContainerNodes() { List <IBuildDependencyOnProjectContainer> projectList = new List <IBuildDependencyOnProjectContainer>(); Debug.Assert(this.Solution != null, "IVsSolution object not set on this object"); if (this.Solution == null) { // Bad state, so we quit return(projectList); } // Enum projects loaded in the solution (normal projects only) IEnumHierarchies enumHierarchies = null; Guid guid = Guid.Empty; __VSENUMPROJFLAGS flags = __VSENUMPROJFLAGS.EPF_LOADEDINSOLUTION; ThreadHelper.ThrowIfNotOnUIThread(); ErrorHandler.ThrowOnFailure(this.Solution.GetProjectEnum((uint)flags, ref guid, out enumHierarchies)); ThreadHelper.ThrowIfNotOnUIThread(); if (enumHierarchies != null) { // Loop projects found IVsHierarchy[] hierarchy = new IVsHierarchy[1]; uint fetched = 0; while (enumHierarchies.Next(1, hierarchy, out fetched) == VSConstants.S_OK && fetched == 1) { // If this is a ProjectContainerNode then add to list IBuildDependencyOnProjectContainer projectNode = hierarchy[0] as IBuildDependencyOnProjectContainer; if (projectNode != null) { projectList.Add(projectNode); } } } return(projectList); }