2009-09-16 5 views
13

J'essaye d'écrire un complément pour Visual Studio qui, entre autres choses, doit garder une trace de chaque fichier dans une solution Visual Studio. Je sais à quels événements je dois m'abonner (quand une solution est ouverte, quand un fichier est ajouté/supprimé/édité dedans, même pour des projets, etc.), mais je ne comprends pas comment obtenir une liste de fichiers de tout cela.Obtenez une liste des fichiers de solution/projet pour le complément VS ou le plug-in DXCore

J'ai récemment installé CodeRush et j'ai joué avec le framework DXCore. Je suis très content de son approche au niveau des plugins, mais je ne vois toujours pas comment obtenir une liste de fichiers dans la solution.

Donc, pour résumer: Comment, via le SDK Visual Studio ou DXCore, puis-je obtenir une liste fiable des fichiers dans la solution et ses projets?

Répondre

5

Tout cela est facilement disponible en utilisant DTE dans Visual Studio SDK.

Vous pouvez obtenir une liste de projets dans une solution à l'aide de l'interface Projects.

Vous pouvez obtenir une liste d'éléments dans un projet à l'aide de l'interface ProjectItem.

Pour plus d'informations, je vous recommande de lire sur Controlling Projects and Solutions.

+15

-1, non, ce n'est pas disponible facilement, cette réponse est juste le résultat d'une recherche rapide Google. Même si l'interface du projet fournit un ProjectItems énumérable, cela ne contient que les éléments de niveau supérieur dans le projet.Les dossiers de projet doivent être traversés et seuls les fichiers sélectionnés. Des noms de fichiers multiples sont également possibles pour les éléments qui compliquent encore cela. –

17

Merci, Reed; l'article que vous avez lié m'a assez loin pour obtenir une preuve de concept dans quelques minutes. Comme je pense que c'est lié, voici les moyens récursifs et d'itération par lesquels j'ai recueilli les ProjectItems. Je l'ai fait dans DXCore, mais la même idée s'applique au SDK Visual Studio brut (DXCore est simplement un wrapper plus esthétique sur le SDK). Les objets 'Solution', 'Projects', 'Project' et 'ProjectItem' sont présents dans EnvDTE.

Projets Réglage

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

itérez les projets pour tirer ÉlémentProjet

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

Enfin, la récursion que je fais pour obtenir tous ÉlémentProjet dans la solution active

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

Quelle est la signification de "CodeRush" ici? – greenoldman

+0

@macias, "CodeRush" est une référence à l'objet principal pour accéder aux services DXCore. La propriété "CodeRush.ApplicationObject" renvoie un objet EnvDTE de l'instance de complément DXCore. Pour en savoir plus, suivez ce lien: http://bit.ly/hrweIk –

+1

BTW, pour obtenir une liste des fichiers solution/projet en utilisant l'API DXCore, utilisez cette ligne de code: IEnumerable files = CodeRush.Source.ActiveSolution .Tous les fichiers; –

1

Voir EnvDTE : Getting all projects (the SolutionFolder PITA)

Cette solution fonctionne avec brio pour obtenir tous les projets dans la solution, même si les projets sont en sous-dossiers.

Assurez-vous de lire les commentaires ci-dessous le code, car il souligne un correctif essentiel, l'utiliser pour saisir ETTD2 au lieu du code d'origine, ou bien qu'il ne soit pas l'instance correcte de Visual Studio:

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

(le code a été mis à jour pour inclure ci-dessus fix)

Questions connexes