2009-09-16 4 views
13

Sto cercando di 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 cosa.Ottenere un elenco di file di soluzione/progetto per il componente aggiuntivo VS o il plugin DXCore

Recentemente 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: Come, tramite Visual Studio SDK o DXCore, ottengo un elenco affidabile di file nella soluzione ed è progetti?

risposta

5

Questo è tutto disponibile facilmente utilizzando DTE nell'SDK di Visual Studio.

È possibile ottenere un elenco di progetti in una soluzione utilizzando l'interfaccia Projects.

È possibile ottenere un elenco di elementi in un progetto utilizzando l'interfaccia ProjectItem.

Per ulteriori informazioni, consiglierei di leggere su Controlling Projects and Solutions.

+15

-1, No, non è facilmente disponibile, questa risposta è solo il risultato di una breve ricerca su Google. Anche se l'interfaccia del progetto fornisce un ProjectItem enumerabile, questo contiene solo gli elementi di primo livello nel progetto.Le cartelle del progetto devono essere attraversate e solo i file selezionati. Sono inoltre possibili nomi di file multipli per elementi che complicano ulteriormente questo aspetto. –

17

Grazie, Reed; l'articolo che hai linkato mi ha fatto abbastanza lontano da ottenere un proof of concept sfornato in un paio di minuti.

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

Impostazione progetti

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

scorrere il Progetti per tirare 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 faccio per ottenere tutti 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; 
} 
+0

qual è il significato di "CodeRush" qui? – greenoldman

+0

@macias, "CodeRush" qui è un riferimento all'oggetto principale per l'accesso ai servizi DXCore. La proprietà "CodeRush.ApplicationObject" restituisce un oggetto EnvDTE dell'istanza del componente aggiuntivo DXCore. Per ulteriori informazioni, seguire questo collegamento: http://bit.ly/hrweIk –

+1

BTW, per ottenere un elenco di file di soluzione/progetto utilizzando l'API DXCore, utilizzare questa riga di codice: IEnumerable files = CodeRush.Source.ActiveSolution .Tutti i files; –

1

Vedi EnvDTE : Getting all projects (the SolutionFolder PITA)

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

Leggere attentamente i commenti qui sotto il codice, come sottolinea una correzione essenziale, utilizzare questo per afferrare DTE2 al posto del codice originale, altrimenti non ottiene la giusta istanza di Visual Studio:

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

(il codice è stato aggiornato per includere sopra fix)

Problemi correlati