Frage

Ich versuche, ein Add-in für Visual Studio, die unter anderem zu schreiben, den Überblick über alle Dateien in einer Visual Studio-Lösung zu halten braucht. Ich weiß, welche Ereignisse wir anmelden müssen (wenn eine Lösung geöffnet wird, wenn eine Datei hinzugefügt / entfernt / in bearbeitet wird, das gleiche gilt für Projekte, etc.), aber ich verstehe nicht, wie eigentlich eine Liste von Dateien erhalten von irgendetwas davon.

I CodeRush vor kurzem installiert und mit dem DXCore Rahmen gespielt. Ich bin sehr zufrieden mit seinem Ansatz an Plugins, aber ich sehe noch keine offensichtliche Möglichkeit, eine Liste von Dateien in der Lösung zu erhalten.

Also um es zusammenzufassen: Wie über das Visual Studio SDK oder DXCore, erhalte ich eine zuverlässige Liste der Dateien in der Lösung und es Projekte

War es hilfreich?

Lösung

Das ist alles leicht DTE in dem Visual Studio SDK zur Verfügung.

Sie können eine Liste von Projekten in einer Lösung erhalten, die Projekte Schnittstelle.

Sie können eine Liste der Elemente in einem Projekt erhalten die ProjectItem Schnittstelle.

Für weitere Informationen, würde ich empfehlen, auf Controlling Projekte und Lösungen .

Andere Tipps

Danke, Reed; der Artikel, den Sie weit genug verknüpft hat mich ein Proof of Concept in ein paar Minuten aufgewühlt zu erhalten.

Da ich es im Zusammenhang fühlen, hier ist die Iteration und rekursive Mittel, mit denen ich die ProjectItems gesammelt. Ich tat dies in DXCore, aber die gleiche Idee gilt für das rohe Visual Studio SDK (DXCore ist nur ein schöneren Wrapper über das SDK). Die 'Lösung', 'Projekte', 'Projekt' und 'ProjectItem' Objekte sind genau dort in EnvDTE.

Einstellung Projekte

EnvDTE.Solution solution = CodeRush.ApplicationObject.Solution;
EnvDTE.Projects projects = solution.Projects;

Iterieren über die Projekte ProjectItems

ziehen
var projects = myProjects.GetEnumerator();
while (projects.MoveNext())
{
    var items = ((Project)projects.Current).ProjectItems.GetEnumerator();
    while (items.MoveNext())
    {
        var item = (ProjectItem)items.Current;
        //Recursion to get all ProjectItems
        projectItems.Add(GetFiles(item));
    }
}

Schließlich Die Rekursion ich für immer alle ProjectItems in der aktiven Lösung tun

ProjectItem GetFiles(ProjectItem item)
{
    //base case
    if (item.ProjectItems == null)
        return item;

    var items = item.ProjectItems.GetEnumerator();
    while (items.MoveNext())
    {
        var currentItem = (ProjectItem)items.Current;
        projectItems.Add(GetFiles(currentItem));
    }

    return item;
}

Siehe EnvDTE: Werden alle Projekte (die SolutionFolder PITA)

Diese Lösung funktioniert hervorragend alle Projekte in der Lösung zu bekommen, auch wenn die Projekte in Unterordner sind.

anstelle des ursprünglichen Codes

Seien Sie sicher, dass die Kommentare unter dem Code zu lesen, da sie einen wesentlichen fix weist darauf hin, verwenden Sie diese DTE2 greifen, sonst ist es nicht die richtige Instanz von Visual Studio erhalten:

DTE2 dte2 = Package.GetGlobalService(typeof(DTE)) as DTE2;

(der Code wurde aktualisiert oben fix enthalten)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top