Question

J'essaie d'écrire un complément pour Visual Studio qui, entre autres choses, doit assurer le suivi de chaque fichier dans une solution Visual Studio. Je sais quels sont les événements auxquels je dois m'abonner (quand une solution est ouverte, quand un fichier est ajouté / supprimé / édité, la même chose pour les projets, etc.), mais je ne comprends pas comment obtenir une liste de fichiers de tout cela.

J'ai récemment installé CodeRush et je joue avec le framework DXCore. Je suis très heureux de l’approche utilisée au niveau des plugins, mais je ne vois toujours pas de moyen évident d’obtenir une liste de fichiers dans la solution.

Pour résumer: Comment puis-je obtenir une liste fiable des fichiers de la solution et de ses projets via le kit de développement logiciel ou DXCore? p>

Était-ce utile?

La solution

Tout cela est facilement disponible en utilisant DTE dans le Kit de développement logiciel de Visual Studio.

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

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

Pour plus d'informations, je vous conseille de lire Contrôle des projets et des solutions .

Autres conseils

Merci, Reed; L'article que vous avez lié m'a amené assez loin pour obtenir une preuve de concept en quelques minutes.

Puisque je pense que c'est lié, voici l'itération et les moyens récursifs par lesquels j'ai collecté les ProjectItems. Je l’ai fait dans DXCore, mais la même idée s’applique au kit de développement Visual Studio SDK brut (DXCore est simplement un emballage plus esthétique par rapport au SDK). Les objets 'Solution', 'Projets', 'Projet' et 'ProjectItem' se trouvent exactement dans EnvDTE.

Définition de projets

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

Itérer sur les projets pour extraire les 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));
    }
}

Enfin, la récursivité que j'utilise pour obtenir tous les éléments de projet 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;
}

Voir EnvDTE: Obtention de tous les projets (le dossier SolutionFolder PITA)

Cette solution fonctionne parfaitement pour intégrer tous les projets dans la solution, même s'ils se trouvent dans des sous-dossiers.

Assurez-vous de lire les commentaires sous le code, car ils soulignent une solution essentielle. Utilisez-le pour récupérer DTE2 au lieu du code d'origine. Sinon, la bonne instance de Visual Studio ne sera pas obtenue:

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top