2

Используя следующий код, вы получите папки с решениями вместо реальных проектов.Visual Studio Macro, чтобы отобразить проекты вместо папок с решениями

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

Есть ли способ, которым я могу пересекать фактические узлы проекта?

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

ответ

10

Я никогда не писал никаких макросов 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 там, потому что вы должны были бы фактически вытащить это из в функцию, что вы могли бы рекурсивно позвонить, если вы хотите иметь дело с вложенными (суб) проектов.

Я получил это решение от this link, и, хотя это материал Visual Studio 2005 года, он может заставить вас двигаться в правильном направлении.

+0

+1 для ссылки. Я попробую и дам вам знать. – Mrchief

+0

Это работает безупречно (это своего рода хак, хотя)! Я оставил бы это открытым, если кто-то сможет найти лучшее решение, иначе это будет принятый ответ. – Mrchief

+0

@Mrchief Рад слышать. Интересно, не так ли это из-за взлома, но просто неудачного наименования? Похоже, что API для этих макросов существенно не изменился с различными обновлениями VS, вероятно, для предотвращения ненужного поломки обратной совместимости. У IIRC Visual Studio 2003 не было концепции папок решений или вложенных проектов. Так может быть, тогда именование было совершенным, но теперь не так много. – ckittel

2

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

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

Выглядит многообещающе с одной проблемой - она ​​также содержит папку «Решения» в качестве проекта. – Mrchief

0

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

+0

Это не то, о чем я прошу. – Mrchief