7

Tengo un proyecto que genera texto (que representa una interfaz y una clase) basado en metadatos. Me gustaría tomar este código generado e insertarlo como una nueva clase e interfaz directamente en la solución abierta actualmente en un proyecto y directorio específico. Voy a crear la herramienta de menú que va a generar la clase, pero lo que no sé hacer es obtener acceso a los siguientes elementos desde el interior de mi costumbre de extensión de Visual Studio:Generar código desde una extensión de Visual Studio

  1. Iterar la solución actual y encontrar un proyecto para volcar el código generado en.
  2. Abra una nueva ventana de archivo dentro de Visual Studio e inyecte el texto generado que proviene de mi herramienta directamente en esa ventana.
  3. Crea una nueva carpeta en un proyecto específico dentro de la solución actual desde mi extensión personalizada.

EDITAR - Para aclarar lo que necesito para abrir un nuevo archivo (por ejemplo, Haga clic derecho en un proyecto -> Añadir -> Nueva Clase) e insertar texto en él desde el interior de mi costumbre de extensión de Visual Studio.

Gracias

+1

¿Ha considerado el uso de plantillas T4 en lugar de una extensión? Puede crear sus metadatos como XML en un archivo .config y ejecutar la plantilla T4 para generar cada clase/interfaz. Sin embargo, solo funciona en un mapeo meta-generado 1-1. – DaveShaw

+0

Sí, en realidad estoy usando plantillas T4 para generar el código ahora, pero estas clases se generan a partir de metadatos dentro de una base de datos, así que no quiero que existan dentro de un proyecto, quiero poder decir al usuario qué tipo de clase ellos quieren y luego genero el código (usando T4) y devuelvo una clase y una interfaz como texto, lo que me deja en las preguntas anteriores. –

+0

Tiene sentido colocar la plantilla T4 en el mismo lugar donde usará el código generado. – StingyJack

Respuesta

10

Para crear un nuevo archivo de una extensión de Visual Studio (ToolWindowPane) utilizar primero el método GetService:

// Get an instance of the currently running Visual Studio IDE 
DTE dte = (DTE)GetService(typeof(DTE)); 

En segundo lugar, asegúrese de que la solución está abierto, si no hay solución está abierto la generación de archivos no funcionará:

string solutionDir = System.IO.Path.GetDirectoryName(dte.Solution.FullName); 

En tercer lugar, generar el nuevo archivo desde el objeto DTE:

dte.ItemOperations.NewFile(@"General\Visual C# Class", "ObjectOne", EnvDTE.Constants.vsViewKindTextView); 

Después de crear el nuevo archivo utilice el siguiente código para acceder al texto de ese archivo y sustituirlo por el texto generado:

TextSelection txtSel = (TextSelection)dte.ActiveDocument.Selection; 
TextDocument txtDoc = (TextDocument)dte.ActiveDocument.Object(""); 

txtSel.SelectAll(); 
txtSel.Delete(); 
txtSel.Insert("Hello World"); 
+0

Cómo guardar el archivo generado sin solicitar el diálogo de guardar (guardar silenciosamente) y agregarlo a la solución como elemento? – Gayan

Cuestiones relacionadas