2009-09-16 9 views
13

Estoy intentando escribir un complemento para Visual Studio que, entre otras cosas, necesita realizar 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 eso.Obtenga una lista de archivos de solución/proyecto para el complemento VS o el complemento DXCore

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

Así que para resumir: ¿Cómo , a través del SDK de Visual Studio o DXCore, puedo obtener una lista fiable de archivos en la solución y es proyectos?

Respuesta

5

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

Puede obtener una lista de proyectos en una solución usando la interfaz Projects.

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

Para obtener más información, recomendaría leer en Controlling Projects and Solutions.

+15

-1, no, no es fácilmente disponible, esta respuesta es simplemente el resultado de una rápida búsqueda en Google. Aunque la interfaz del proyecto proporciona un elemento de proyecto enumerable, que solo contiene los elementos de nivel superior en el proyecto.Las carpetas de proyectos deben atravesarse y solo los archivos seleccionados. Múltiples nombres de archivo también son posibles para los artículos que complican aún más esto. –

17

Gracias, Reed; el artículo que vinculó me ayudó a obtener una prueba de concepto en un par de minutos.

Dado que siento que está relacionado, aquí está la iteración y los medios recursivos por los que recolecté los Elementos del proyecto. Hice esto en DXCore, pero la misma idea se aplica al SDK de Visual Studio en bruto (DXCore es simplemente una envoltura de aspecto más agradable sobre el SDK). Los objetos 'Solución', 'Proyectos', 'Proyecto' y 'ProjectItem' están ahí en EnvDTE.

los proyectos para la

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

interactuando sobre los proyectos para tirar 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)); 
    } 
} 

Por último, la recursividad que hago para conseguir todos los ProjectItems 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; 
} 
+0

¿cuál es el significado de "CodeRush" aquí? – greenoldman

+0

@macias, "CodeRush" aquí es una referencia al objeto principal para acceder a los servicios de DXCore. La propiedad "CodeRush.ApplicationObject" devuelve un objeto EnvDTE de la instancia del complemento DXCore. Para obtener más información, siga este enlace: http://bit.ly/hrweIk –

+1

BTW, para obtener una lista de archivos de solución/proyecto con la API DXCore, use esta línea de código: IEnumerable files = CodeRush.Source.ActiveSolution .Todos los archivos; –

1

Ver EnvDTE : Getting all projects (the SolutionFolder PITA)

Esta solución funciona muy bien para conseguir todos los proyectos en la solución, incluso si los proyectos están en subcarpetas.

Asegúrese de leer los comentarios a continuación el código, ya que señala una solución esencial, usar esto para agarrar DTE2 en lugar del código original, o de lo contrario no recibe la instancia correcta de Visual Studio:

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

(el código se ha actualizado para incluir más arriba fix)

Cuestiones relacionadas