Generowanie kodu czasu projektowania przy użyciu szablonów tekst T4
Projektowania T4 tekst Szablony umożliwiają generowanie kodu programu i innych plików w sieci Visual Studio projektu.Zazwyczaj szablony pisać tak, że różnią się one kod, który generują według danych z model.Model jest pliku lub bazy danych, który zawiera najważniejsze informacje dotyczące wymagań aplikacji.
Na przykład może mieć model, który definiuje przepływu pracy, albo w postaci tabeli lub diagramu.Z modelu można wygenerować oprogramowania, które wykonuje przepływu pracy.Zmiana wymagań użytkowników, jest łatwe do omówienia nowego przepływu pracy z użytkownikami.Ponowne generowanie kodu z przepływu pracy jest bardziej wiarygodne niż ręcznie aktualizowanie kodu.
[!UWAGA]
A model jest źródło danych, który opisuje konkretnego aspektu wniosku.Może być w jakiejkolwiek formie, w każdym rodzaju pliku lub bazie danych.Nie ma w żadnej szczególnej formy, takie jak UML model lub model języka specyficznego dla domeny.Typowe modele są w postaci plików XML lub tabel.
Prawdopodobnie już znasz generowania kodu.Podczas definiowania zasobów w .resx plik w sieci Visual Studio rozwiązanie, zestaw klas i metod jest generowany automatycznie.Plik zasobów umożliwia znacznie łatwiejsze i bardziej wiarygodne, aby edytować zasobów niż będzie miał do edycji klasy i metody.Za pomocą szablonów tekstu może wygenerować kod w taki sam sposób, od źródła własnego projektu.
Szablon tekst zawiera tekst, który chcesz wygenerować i kodu programu, który generuje zmiennej części tekstu.Kod programu i pozwala powtórzyć lub warunkowo pominięcie części wygenerowany tekst.Wygenerowany tekst może sam być kodu programu, która stanowi część aplikacji.
Tworzenie szablonu projektowania T4
Aby utworzyć szablon T4 projektowania w Visual Studio
Tworzenie Visual Studio projektu lub Otwórz istniejący.
Na przykład na pliku menu, wybierz opcję Nowy, Projekt.
Dodawanie szablonu pliku tekstowego do projektu i nadaj mu nazwę, która ma .tt rozszerzenia.
W tym celu, w Solution Explorer, w menu skrótów, projektu, wybierz opcję Dodaj, Nowego elementu.W Dodaj nowy element okno dialogowe Wybierz Tekst szablonu z środkowym okienku.
Należy zauważyć, że Niestandardowego narzędzia właściwość pliku jest TextTemplatingFileGenerator.
Otwórz plik.Będą już zawierać następujące dyrektywy:
<#@ template hostspecific="false" language="C#" #> <#@ output extension=".txt" #>
Jeśli dodany szablon do Visual Basic projekt, będzie atrybut language "VB".
Dodaj tekst na końcu pliku.Na przykład:
Hello, world!
Zapisz plik.
Może pojawić się Ostrzeżenie o zabezpieczeniach okno komunikatu z pytaniem o potwierdzenie uruchomienia szablonu.Kliknij przycisk OK.
W Solution Explorer, rozwiń węzeł plik szablonu i plik, który ma rozszerzenie .txt.Plik zawiera tekst wygenerowany z szablonu.
[!UWAGA]
Jeśli projekt jest projektu języka Visual Basic, należy kliknąć Pokaż wszystkie pliki Aby zobaczyć plik wyjściowy.
Ponowne generowanie kodu
Szablon zostanie wykonana, generowanie plików pomocniczych, w następujących przypadkach:
Edytowanie szablonu, a następnie zmienić fokus na inny Visual Studio okna.
Zapisz szablon.
Kliknij przycisk Przekształcić wszystkie szablony w budować menu.Zmieni to szablony w Visual Studio rozwiązanie.
W Solution Explorer, w menu skrótów z dowolnego pliku, wybierz Uruchomić narzędzie niestandardowe.Metoda ta służy do przekształcania podzbiór wybrane szablony.
Można także skonfigurować Visual Studio projekt tak, że szablony są wykonywane, gdy pliki danych, które czytają uległy zmianie.Aby uzyskać więcej informacji, zobacz Automatyczne ponowne generowanie kodu.
Tekst zmiennej
Tekst Szablony pozwalają zmieniać zawartość pliku wygenerowanego za pomocą kodu programu.
Aby wygenerować tekstu za pomocą kodu programu
Zmiana zawartości .tt pliku:
<#@ template hostspecific="false" language="C#" #> <#@ output extension=".txt" #> <#int top = 10; for (int i = 0; i<=top; i++) { #> The square of <#= i #> is <#= i*i #> <# } #>
<#@ template hostspecific="false" language="VB" #> <#@ output extension=".txt" #> <#Dim top As Integer = 10 For i As Integer = 0 To top #> The square of <#= i #> is <#= i*i #> <# Next #>
Zapisz plik .tt i sprawdzenie pliku .txt generowany ponownie.Wyświetla listę kwadratów liczb od 0 do 9.
Należy zauważyć, że sprawozdania są ujęte w <#...#>i jedno z wyrażeń w <#=...#>.Aby uzyskać więcej informacji, zobacz Zapisywanie szablonu tekst T4.
Jeśli piszesz generowania kodu w Visual Basic, template dyrektywa powinna zawierać language="VB"."C#"jest wartością domyślną.
Debugowanie szablonu projektowania T4
Aby debugować szablonu:
Wstaw debug="true" do template dyrektywy.Na przykład:
<#@ template debug="true" hostspecific="false" language="C#" #>
Ustawić punkty przerwania w szablonie, w taki sam sposób, że w przypadku zwykłych kod.
Wybierz Debugowania szablon T4 pliku szablonu tekst w oknie Solution Explorer, w menu skrótów.
Szablon będzie uruchomić i zatrzymać się na użycie punktów przerwania.Można zbadać zmiennych i Przejdź kod krok w zwykły sposób.
Porada |
---|
debug="true"sprawia, że wygenerowany kod mapować dokładniej szablon tekstu, wstawiając więcej numerowanie dyrektyw w wygenerowanym kodzie.Jeśli zostawisz to punkty przerwania może spowodować zatrzymanie run w niewłaściwym stanie. Ale nawet wtedy, gdy nie debugowania, można pozostawić klauzula w dyrektywie szablonu.Powoduje tylko bardzo niewielki spadek wydajności. |
Generowanie kodu lub zasobów dla rozwiązania
Można wygenerować pliki programów, które zależą od modelu.Model jest wejście bazy danych, plik konfiguracyjny, modelu UML, model modemu DSL lub innego źródła.Kilka zwykle generować pliki programów są z tego samego modelu.Aby to osiągnąć, Utwórz plik szablonu dla każdego pliku program wygenerowany, a wszystkie szablony przeczytać ten sam model.
Aby wygenerować kod programu lub zasobów
Należy zmienić dyrektywę wyjściową, aby wygenerować plik odpowiedniego typu, .cs, .vb, resx lub .xml.
Wstawianie kodu, która będzie generować kod rozwiązania, które wymagają.Na przykład, jeśli chcesz wygenerować trzy deklaracje pola Liczba całkowita w klasy:
<#@ template debug="false" hostspecific="false" language="C#" #> <#@ output extension=".cs" #> <# var properties = new string [] {"P1", "P2", "P3"}; #> class MyGeneratedClass { <# foreach (string propertyName in properties) { #> private int <#= propertyName #> = 0; <# } #> }
<#@ template debug="false" hostspecific="false" language="VB" #> <#@ output extension=".cs" #> <# Dim properties = {"P1", "P2", "P3"} #> class MyGeneratedClass { <# For Each propertyName As String In properties #> private int <#= propertyName #> = 0; <# Next #> }
Zapisz plik i sprawdzić wygenerowany plik, który teraz zawiera następujący kod:
class MyGeneratedClass { private int P1 = 0; private int P2 = 0; private int P3 = 0; }
Generowanie kodu i wygenerowany tekst
Podczas generowania kodu programu jest najbardziej istotne dla uniknięcia zamieszania generowania kodu, który wykonuje w szablonie, a wynikowy wygenerowany kod, który staje się częścią rozwiązania.Oba języki nie muszą być takie same.
Poprzedni przykład ma dwie wersje.W jednej wersji generowania kodu jest w C#.W innych wersji generowania kodu jest Visual Basic.Ale tekst wygenerowany przez obu z nich jest taki sam, i jest to klasa C#.
W ten sam sposób, można użyć Visual C# szablonu do generowania kodu w dowolnym języku.Wygenerowany tekst nie ma być w dowolnym określonego języka i nie musi być kod programu.
Tworzenie struktury szablonów tekstu
Jako dobrej praktyki zwykle oddzielne kod szablonu na dwie części:
Konfiguracja lub części gromadzenia danych, który ustawia wartości zmiennych, ale nie zawiera bloki tekstu.W poprzednim przykładzie, ta część jest zainicjowanie properties.
Czasami nazywa w sekcji "model", ponieważ tworzy model w Sklepie i zazwyczaj odczytuje plik modelu.
Część tekstu generacji (foreach(...){...} w przykładzie), który używa wartości zmiennych.
Nie jest konieczne separacji, ale to styl, który sprawia, że łatwiej odczytać szablonu, zmniejszając złożoność część, która zawiera tekst.
Czytanie plików lub innych źródeł
Dostęp do pliku modelu lub bazy danych, Twój kod szablonu można użyć zespołów, takich jak System.XML.Aby uzyskać dostęp do tych zespołów, należy wstawić dyrektywy, jak:
<#@ assembly name="System.Xml.dll" #>
<#@ import namespace="System.Xml" #>
<#@ import namespace="System.IO" #>
assembly Dyrektywy udostępnia określonego zestawu kodu szablonu, w taki sam sposób jak odniesienia Visual Studio projektu.Nie trzeba dołączyć odwołanie do System.dll, która odwołuje się automatycznie.import Dyrektywy pozwala na używanie typów bez użycia ich w pełni kwalifikowane nazwy w taki sam sposób jak using w pliku zwykłego programu w dyrektywie.
Na przykład po zaimportowaniu System.IO, mógłby napisać:
<# var properties = File.ReadLines("C:\\propertyList.txt");#>
...
<# foreach (string propertyName in properties) { #>
...
<# For Each propertyName As String In
File.ReadLines("C:\\propertyList.txt")
#>
Otwieranie pliku z względną ścieżkę
Aby załadować plik z lokalizacji względem tekst szablonu, można użyć this.Host.ResolvePath().Aby użyć tego.Host, należy ustawić hostspecific="true" w template:
<#@ template debug="false" hostspecific="true" language="C#" #>
Następnie można napisać, na przykład:
<# string fileName = this.Host.ResolvePath("filename.txt");
string [] properties = File.ReadLines(filename);
#>
...
<# foreach (string propertyName in properties { #>
...
<# Dim fileName = Me.Host.ResolvePath("propertyList.txt")
Dim properties = File.ReadLines(filename)
#>
...
<# For Each propertyName As String In properties
...
#>
Można również użyć this.Host.TemplateFile, który identyfikuje nazwę bieżącego pliku szablonu.
The type of this.Host (in VB, Me.Host) is Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost.
Pobieranie danych zVisual Studio
Aby użyć usługi świadczone w Visual Studio, zestaw hostSpecific atrybut i obciążenia EnvDTE zestawu.Następnie można IServiceProvider.GetCOMService() dostęp do DTE i innych usług.Na przykład:
<#@ template hostspecific="true" language="C#" #>
<#@ output extension=".txt" #>
<#@ assembly name="EnvDTE" #>
<#
IServiceProvider serviceProvider = (IServiceProvider)this.Host;
EnvDTE.DTE dte = (EnvDTE.DTE) serviceProvider.GetCOMService(typeof(EnvDTE.DTE));
#>
Number of projects in this VS solution: <#= dte.Solution.Projects.Count #>
Porada |
---|
Szablon tekst biegnie w domenie aplikacji i usług są dostępne przez kierowanie.W takim przypadku GetCOMService() jest bardziej wiarygodne niż GetService(). |
Automatyczne ponowne generowanie kodu
Zazwyczaj kilka plików w Visual Studio rozwiązanie są generowane z jednego modelu wejściowych.Każdy plik jest generowany na podstawie jego własny szablon, ale szablony wszystkie odnoszą się do tego samego modelu.
Jeśli zmiany w modelu źródłowym, należy ponownie uruchomić wszystkie szablony w roztworze.Aby zrobić to ręcznie, wybierz opcję Przekształcić wszystkie szablony na budować menu.
Jeśli zainstalowano Visual Studio wizualizacji i modelowania SDK, można mieć wszystkie szablony, które są przekształcane automatycznie przy każdym wykonaniu kompilacji.Aby to zrobić, edytować plik projektu (.csproj lub .vbproj) w edytorze tekstów i dodaj następujące wiersze w pobliżu na końcu pliku, po innych <import> instrukcji:
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v11.0\TextTemplating\Microsoft.TextTemplating.targets" />
<PropertyGroup>
<TransformOnBuild>true</TransformOnBuild>
<!-- Other properties can be inserted here -->
</PropertyGroup>
Aby uzyskać więcej informacji, zobacz Generowanie kodu w proces kompilacji.
Raportowanie błędów
Umieścić błędów i komunikaty ostrzegawcze w Visual Studio okno błąd, można użyć następujących metod:
Error("An error message");
Warning("A warning message");
Konwertowanie istniejącego pliku szablonu
Użyteczną funkcję szablonów jest, że wyglądają bardzo podobnie jak pliki, które generują, wraz z kodem jakiś program wstawionego.Sugeruje to użyteczna metoda tworzenia szablonu.Najpierw jako prototyp, można utworzyć zwykły plik Visual C# plik, a następnie stopniowo wprowadzać kod generacji, który zmienia się w wynikowym pliku.
Aby przekonwertować istniejący plik do szablonu projektowania
Do swojej Visual Studio projektu, dodać plik typu, który chcesz wygenerować, takich jak .cs, .vb, lub .resx pliku.
Test nowego pliku, aby upewnić się, że działa.
W oknie Solution Explorer zmień rozszerzenie nazwy pliku do .tt.
Sprawdź następujące właściwości .tt pliku:
Niestandardowe narzędzie =
TextTemplatingFileGenerator
Tworzenie akcji =
Brak
Na początku pliku wstawić następujące wiersze:
<#@ template debug="false" hostspecific="false" language="C#" #> <#@ output extension=".cs" #>
Jeśli chcesz napisać generowania kodu szablonu w Visual Basic, zestaw language atrybut "VB" zamiast "C#".
Zestaw extension atrybut rozszerzenie nazwy pliku dla typu pliku, który chcesz wygenerować, na przykład .cs, .resx, lub .xml.
Zapisz plik.
Pomocniczy plik jest tworzony z określonym rozszerzeniem.Jego właściwości są poprawne dla danego typu pliku.Na przykład Tworzenie akcji właściwość pliku cs będzie kompilacji.
Upewnij się, że wygenerowany plik zawiera tę samą zawartość co oryginalny plik.
Określić część pliku, który chcesz zmieniać.Na przykład część, która pojawia się tylko pod pewnymi warunkami, lub część, która się powtarza, lub gdzie określone wartości różnią się.Wstaw generowania kodu.Zapisz plik i zweryfikować pliku uzupełniającej poprawnie generowany jest.Powtórz ten krok.
Wytyczne do generowania kodu
Zobacz Wskazówki dotyczące pisania szablony tekst T4.
Kolejne kroki
Następny krok |
Temat |
---|---|
Pisanie i debugowania bardziej zaawansowanych szablonu, za pomocą kodu, który wykorzystuje funkcje dodatkowe, dołączone pliki i trwałych danych. |
|
Generowanie dokumentów z szablonów w czasie wykonywania. |
|
Uruchom generowanie tekstu poza Visual Studio. |
|
Przekształcenia danych w postaci języka specyficznego dla domeny. |
|
Pisanie w dyrektywie procesorów do przekształcenia źródła danych. |