2016-08-03 239 views
5

嗨我有一个问题,在Visual Studio扩展中的自定义生成任务。我需要确定我的自定义项目类型的项目。如果它们位于解决方案的根目录下,我可以做得很好,但问题发生在解决方案文件夹内时。我可以将解决方案文件夹作为EnvDTE.Project,但不知道如何从该文件夹中获取项目。如何在解决方案文件夹中的VSIX项目中获得项目

我想我可以从项目集合属性中获得它,但是这是null。

任何援助将不胜感激。

if (Scope == EnvDTE.vsBuildScope.vsBuildScopeSolution) 
{ 
    DTE2 dte2 = Package.GetGlobalService(typeof(EnvDTE.DTE)) as DTE2; 
    var sol = dte2.Solution; 
    EnvDTE.DTE t = dte2.DTE; 
    var x = t.Solution.Projects; 
    foreach(var proj in x) 
    { 
     try 
     { 
      var project = proj as EnvDTE.Project; 
      var guid = GetProjectTypeGuids(project); 
      if (guid.Contains("FOLDERGUID")) 
      { 
       //here is where I would get the project from the folder 
      } 

回答

10

我设法解决这个问题,多了一些研究和一些试验和错误。如果任何人想出了这个问题,我改变了主代码

if (Scope == EnvDTE.vsBuildScope.vsBuildScopeSolution) 
{ 
    errorListProvider.Tasks.Clear(); 
    DTE2 dte2 = Package.GetGlobalService(typeof(DTE)) as DTE2; 
    var sol = dte2.Solution; 
    var projs = sol.Projects; 
    foreach(var proj in sol) 
    { 
     var project = proj as Project; 
     if (project.Kind == ProjectKinds.vsProjectKindSolutionFolder) 
     { 
      var innerProjects = GetSolutionFolderProjects(project); 
      foreach(var innerProject in innerProjects) 
      { 
       //carry out actions here. 
      } 
     } 
    } 
} 

的GetSolutionFolderForProjects的代码是

private IEnumerable<Project> GetSolutionFolderProjects(Project project) 
{ 
    List<Project> projects = new List<Project>(); 
    var y = (project.ProjectItems as ProjectItems).Count; 
    for(var i = 1; i <= y; i++) 
    { 
     var x = project.ProjectItems.Item(i).SubProject; 
     var subProject = x as Project; 
     if (subProject != null) 
     { 
      //Carried out work and added projects as appropriate 
     } 
    } 

    return projects; 
} 

希望这有助于别人。

+0

感谢戴夫 - 我已经发现这对我的v6开发工作很有用 –

+0

伟大的工作戴夫,欣赏这项工作! – dprothero

相关问题