Obtenga una lista de archivos de solución / proyecto para el complemento VS o el complemento DXCore

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

Pregunta

Estoy tratando de escribir un complemento para Visual Studio que, entre otras cosas, necesita hacer un seguimiento de cada archivo en una solución de Visual Studio. Sé a qué eventos necesito suscribirme (cuando se abre una Solución, cuando se agrega / elimina / edita un archivo, lo mismo para proyectos, etc.), pero no entiendo cómo obtener realmente una lista de archivos de cualquiera de ellos.

Recientemente instalé CodeRush y he estado jugando con el framework DXCore. Estoy muy contento con su enfoque en los complementos, pero todavía no veo una manera obvia de obtener una lista de archivos en la solución.

Entonces, para resumir: ¿Cómo, a través del SDK de Visual Studio o DXCore, obtengo una lista confiable de archivos en la solución y sus proyectos?

¿Fue útil?

Solución

Todo esto está disponible fácilmente usando DTE en el SDK de Visual Studio.

Puede obtener una lista de proyectos en una solución utilizando Proyectos interfaz.

Puede obtener una lista de elementos en un proyecto usando interfaz ProjectItem .

Para obtener más información, recomiendo leer en Control de proyectos y soluciones .

Otros consejos

Gracias, Reed; el artículo que vinculó me llevó lo suficientemente lejos como para obtener una prueba de concepto en un par de minutos.

Como creo que está relacionado, aquí está la iteración y los medios recursivos por los cuales recopilé los ProjectItems. Hice esto en DXCore, pero la misma idea se aplica al SDK de Visual Studio sin procesar (DXCore es simplemente un contenedor de aspecto más agradable sobre el SDK). Los objetos 'Solution', 'Projects', 'Project' y 'ProjectItem' están ahí en EnvDTE.

Configuración de proyectos

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

Iterando sobre los Proyectos para extraer 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));
    }
}

Finalmente, la recursión que hago para obtener todos los Artículos de Proyecto en la Solución activa

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

Ver EnvDTE: Obteniendo todos los proyectos (el SolutionFolder PITA)

Esta solución funciona de manera brillante para obtener todos los proyectos en la solución, incluso si los proyectos están en subcarpetas.

Asegúrese de leer los comentarios debajo del código, ya que señala una solución esencial, use esto para tomar DTE2 en lugar del código original, o de lo contrario no obtendrá la instancia correcta de Visual Studio:

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

(el código se actualizó para incluir la corrección anterior)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top