7

Mam projekt, który generuje tekst (reprezentujący interfejs i klasę) na podstawie metadanych. Chciałbym wziąć wygenerowany kod i wstawić go jako nową klasę i interfejs bezpośrednio do aktualnie otwartego rozwiązania w ramach konkretnego projektu i katalogu. Utworzę narzędzie menu, które wygeneruje klasę, ale nie wiem, jak to zrobić, to uzyskać dostęp do następujących elementów z mojego niestandardowego rozszerzenia Visual Studio:Generowanie kodu z rozszerzenia Visual Studio

  1. Potraktuj obecne rozwiązanie i znajdź projekt zrzucić wygenerowany kod do.
  2. Otwórz nowe okno pliku w programie Visual Studio i wprowadź wygenerowany tekst pochodzący z mojego narzędzia bezpośrednio do tego okna.
  3. Utwórz nowy folder w konkretnym projekcie w ramach bieżącego rozwiązania z mojego niestandardowego rozszerzenia.

EDIT - Aby wyjaśnić muszę otworzyć nowy plik (np prawym przyciskiem myszy na projekt -> Add -> New Class) i wstawić tekst do niego ze w moim zwyczaju Visual Studio Extension.

Dzięki

+1

Czy za pomocą szablonów T4 zamiast rozszerzenia? Możesz utworzyć swoje dane meta jako XML w pliku .config i uruchomić szablon T4, aby wygenerować każdą klasę/interfejs. Działa to tylko w przypadku generowania 1-1 meta-generowania. – DaveShaw

+0

Tak, faktycznie używam szablonów T4 do generowania kodu teraz, ale te klasy są generowane z metadanych w bazie danych, więc nie chcę, aby istniały wewnątrz projektu, chcę być w stanie pozwolić użytkownikowi powiedzieć, który typ klasy chcą, a następnie generuję kod (używając T4) i zwracam klasę oraz interfejs jako tekst, co pozostawia mnie na powyższych pytaniach. –

+0

Sensowne jest umieszczenie szablonu T4 w tym samym miejscu, w którym będzie używany wygenerowany kod. – StingyJack

Odpowiedz

10

tworzenia nowego pliku z Visual Studio Extension (ToolWindowPane) najpierw użyć metody getService:

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

drugie, upewnić się, że rozwiązanie jest obecnie otwarty, jeśli rozwiązanie nie jest otwarty generowanie pliku nie będzie działać:

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

trzecie, wygenerować nowy plik z obiektu DTE:

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

Po utworzeniu nowego pliku należy użyć następującego kodu, aby uzyskać dostęp do tekstu tego pliku i zastąpić go z wygenerowanym tekstem:

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

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

Jak zapisać Wygenerowany plik bez pytania o zapisanie okna dialogowego (zapis cichy) i dodać do rozwiązania jako przedmiot? – Gayan