7

Ho un progetto che genera testo (che rappresenta un'interfaccia e una classe) in base ai metadati. Vorrei prendere questo codice generato e inserirlo come una nuova classe e interfacciarlo direttamente nella soluzione attualmente aperta sotto un progetto e una directory specifici. Creerò lo strumento menu che genererà la classe, ma quello che non so come fare è ottenere l'accesso alle seguenti voci da dentro il mio personalizzato Visual Studio Estensione:Genera codice da un'estensione Visual Studio

  1. Itera la soluzione attuale e trovare un progetto per scaricare il codice generato in.
  2. Apre una nuova finestra di file in Visual Studio e inserisce il testo generato proveniente dal mio strumento direttamente in quella finestra.
  3. Creare una nuova cartella in un progetto specifico all'interno della soluzione corrente dall'interno personalizzato.

EDIT - Per chiarire che ho bisogno di aprire un nuovo file (ad esempio Fare clic destro su un progetto -> Aggiungi -> Nuova Classe) e inserire il testo in esso da dentro il mio personalizzato Visual Studio Extension.

Grazie

+1

Hai pensato di usare modelli T4 invece di una proroga? È possibile creare i metadati come XML in un file .config ed eseguire il modello T4 per generare ogni classe/interfaccia. Tuttavia, funziona solo su una mappatura meta-generata 1-1. – DaveShaw

+0

Sì, in realtà sto usando i modelli T4 per generare il codice ora, ma queste classi sono generate dai metadati all'interno di un database, quindi non voglio che esistano all'interno di un progetto, voglio essere in grado di consentire all'utente di dire quale tipo di classe loro vogliono e poi io genero il codice (usando T4) e restituisco una classe e un'interfaccia come testo, che mi lascia alle domande sopra. –

+0

Ha senso inserire il modello T4 nello stesso punto in cui si utilizzerà il codice generato. – StingyJack

risposta

10

Per la creazione di un nuovo file da uno studio di estensione visiva (ToolWindowPane) prima di utilizzare il metodo GetService:

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

In secondo luogo, in modo che una soluzione è aperto, se nessuna soluzione è aperto la generazione di file non funziona:

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

In terzo luogo, generare il nuovo file dall'oggetto DTE:

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

Dopo aver creato il nuovo file utilizzare il seguente codice per accedere al testo di quel file e sostituirlo con il testo generato:

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

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

Come salvare il file generato senza richiedere la finestra di dialogo di salvataggio (salvataggio silenzioso) e aggiungere alla soluzione come elemento? – Gayan

Problemi correlati