Ottieni un elenco di file di soluzioni / progetti per il componente aggiuntivo VS o il plug-in DXCore

StackOverflow https://stackoverflow.com/questions/1434720

Domanda

Sto provando a scrivere un componente aggiuntivo per Visual Studio che, tra le altre cose, deve tenere traccia di ogni file in una soluzione di Visual Studio. So a quali eventi devo iscrivermi (quando viene aperta una soluzione, quando un file viene aggiunto / rimosso / modificato in esso, lo stesso per i progetti, ecc.), Ma non capisco come ottenere effettivamente un elenco di file da qualsiasi di esso.

Di recente ho installato CodeRush e ho giocato con il framework DXCore. Sono molto contento del suo approccio ai plugin, ma non vedo ancora un modo ovvio per ottenere un elenco di file nella soluzione.

Quindi, per riassumere: In che modo, tramite Visual Studio SDK o DXCore, ottengo un elenco affidabile di file nella soluzione e nei suoi progetti?

È stato utile?

Soluzione

Tutto questo è facilmente disponibile usando DTE in Visual Studio SDK.

Puoi ottenere un elenco di progetti in una soluzione utilizzando Progetti interfaccia.

Puoi ottenere un elenco di elementi in un progetto usando ProjectItem interfaccia.

Per ulteriori informazioni, consiglierei di leggere su Controllo di progetti e soluzioni .

Altri suggerimenti

Grazie, Reed; l'articolo che hai collegato mi ha portato abbastanza lontano da ottenere una prova del concetto sfornato in un paio di minuti.

Poiché ritengo che sia correlato, ecco l'iterazione e i mezzi ricorsivi con cui ho raccolto i ProjectItems. L'ho fatto in DXCore, ma la stessa idea si applica al Visual Studio SDK non elaborato (DXCore è semplicemente un wrapper dall'aspetto migliore rispetto all'SDK). Gli oggetti 'Solution', 'Projects', 'Project' e 'ProjectItem' sono proprio lì in EnvDTE.

Impostazione dei progetti

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

Iterazione sui progetti per estrarre ProjectItems

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));
    }
}

Infine, la ricorsione che faccio per ottenere tutti gli ProjectItems nella soluzione attiva

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;
}

Vedi EnvDTE: Ottenere tutti i progetti (la SolutionFolder PITA)

Questa soluzione funziona brillantemente per ottenere tutti i progetti nella soluzione, anche se i progetti si trovano in sottocartelle.

Assicurati di leggere i commenti sotto il codice, poiché indica una correzione essenziale, usalo per prendere DTE2 invece del codice originale, altrimenti non ottiene l'istanza corretta di Visual Studio:

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

(il codice è stato aggiornato per includere la correzione sopra)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top