2

次のコードを使用すると、実際のプロジェクトではなくソリューションフォルダが表示されます。ソリューションフォルダの代わりにプロジェクトをリストするVisual Studioマクロ

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

私はあなたが次のことを試して、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

「Solution Items」フォルダもプロジェクトとしてリストアップされています。 – Mrchief

0

での私のブログから、より大きなマクロのその一部、プロパティとしてProjectItem.SubProject

+0

それは私が求めているものではありません。 – Mrchief

関連する問題