Visual Studio Macro для вывода списка проектов вместо папок решения - PullRequest
2 голосов
/ 29 марта 2011

Использование следующего кода дает мне папки решений вместо реальных проектов.

projectName = DTE.Solution.SolutionBuild.StartupProjects(0)
For Each project In DTE.Solution.Projects
    If project.UniqueName = projectName Then
        Return project
    End If
Next

Есть ли способ зацикливаться на реальных узлах проекта?

Я пытаюсь прочитать свойства из стартового проекта.

Ответы [ 3 ]

10 голосов
/ 02 августа 2011

Я никогда не писал макросов для Visual Studio, но это может быть то, что вы ищете.

projectName = DTE.Solution.SolutionBuild.StartupProjects(0)
For Each project In DTE.Solution.Projects
    If (project.ConfigurationManager IsNot Nothing) Then
        ' It's a project!
        If (project.UniqueName = projectName) Then Return project
    Else
        If (project.ProjectItems IsNot Nothing) Then
            For Each projectItem In project.ProjectItems
                If (projectItem.SubProject IsNot Nothing) Then
                   ' TODO: Recurse on projectItem.SubProject 
                End If
            Next
        End If
    End If
Next

Я оставил там 'TODO', потому что вам действительно нужно было бы извлечь это вфункция, которую вы можете вызывать рекурсивно, если вы хотите иметь дело с вложенными (под) проектами.

Я получил это решение от по этой ссылке , и хотя это материал эпохи Visual Studio 2005,это может привести вас в правильном направлении.

2 голосов
/ 07 августа 2011

Я думаю, что вы можете проверить на соответствие константам VS, попробуйте следующее:

Private Function GetAllProjects() As Generic.List(Of Project)
    Dim lst As New Generic.List(Of Project)
    For Each proj As Project In DTE.Solution.Projects
    If proj.Kind = Constants.vsProjectKindSolutionItems Then
        lst.AddRange(GetSubProjects(proj.ProjectItems))
    Else
        lst.Add(proj)
    End If
    Next
    Return lst
End Function

Private Function GetSubProjects(ByVal pis As ProjectItems) As Generic.List(Of Project)
    Dim lst As New Generic.List(Of Project)
    For Each pi As ProjectItem In pis
    If pi.Kind = Constants.vsProjectItemKindSolutionItems Then
        lst.Add(pi.SubProject)
    ElseIf pi.Kind = Constants.vsProjectKindSolutionItems Then
        lst.AddRange(GetSubProjects(pi.ProjectItems))
    End If
    Next
    Return lst
End Function

Это часть большего макроса из моего блога на http://www.brianschmitt.com/2009/10/fixing-visual-studio-add-reference.html

0 голосов
/ 09 сентября 2011

Чтобы получить проект из папки Solution, используйте свойство ProjectItem.SubProject

...