Dyrektywa T4 dotycząca szablonu
Szablon tekstowy programu Visual Studio T4 zwykle rozpoczyna się od template
dyrektywy, która określa sposób przetwarzania szablonu. Powinna istnieć nie więcej niż jedna dyrektywa szablonu w szablonie tekstowym i wszystkich plikach, które on uwzględnia.
Aby zapoznać się z ogólnym omówieniem pisania szablonów tekstu, zobacz Pisanie szablonu tekstowego T4.
Używanie dyrektywy Template
<#@ template [language="VB"] [compilerOptions="options"] [culture="code"] [debug="true"] [hostspecific="true"] [inherits="templateBaseClass"] [visibility="internal"] [linePragmas="false"] #>
Dyrektywa template
ma kilka atrybutów, które umożliwiają określenie różnych aspektów transformacji. Wszystkie atrybuty są opcjonalne.
Atrybut compilerOptions
Przykład:
compilerOptions="optimize+"
Prawidłowe wartości:
Wszystkie prawidłowe opcje kompilatora.
Ignorowane dla szablonów w czasie wykonywania (wstępnie przetworzonych).
Te opcje są stosowane, gdy szablon został przekonwertowany na język Visual C# lub Visual Basic, a wynikowy kod jest kompilowany.
Atrybut culture
Przykład:
culture="de-CH"
Prawidłowe wartości:
"", niezmienna kultura, co jest ustawieniem domyślnym.
Kultura jest wyrażona jako ciąg w postaci xx-XX. Na przykład en-US, ja-JP, de-CH, de-DE. W celu uzyskania więcej informacji, zobacz następujący temat: System.Globalization.CultureInfo.
Atrybut culture określa kulturę, jaka ma zostać użyta w przypadku konwersji bloku wyrażenia na tekst.
Atrybut debug
Przykład:
debug="true"
Prawidłowe wartości:
true
false
(domyślne)
debug
Jeśli atrybut to true
, plik kodu pośredniego będzie zawierać informacje, które umożliwiają debugerowi dokładniejsze zidentyfikowanie pozycji w szablonie, w którym wystąpił podział lub wyjątek.
W przypadku szablonów czasu projektowania plik kodu pośredniego zostanie zapisany w katalogu %TEMP%.
Aby uruchomić szablon czasu projektowania w debugerze, zapisz szablon tekstowy, a następnie otwórz menu skrótów szablonu tekstowego w Eksplorator rozwiązań, a następnie wybierz pozycję Debuguj szablon T4.
Atrybut hostspecific
Przykład:
hostspecific="true"
Prawidłowe wartości:
true
false
(domyślne)
trueFromBase
Jeśli ustawisz wartość tego atrybutu na true
, właściwość o nazwie Host
zostanie dodana do klasy wygenerowanej przez szablon tekstowy. Właściwość jest odwołaniem do hosta aparatu przekształcania i jest zadeklarowana jako ITextTemplatingEngineHost. Jeśli został zdefiniowany niestandardowy host, można go rzutować na niestandardowy typ hosta.
Ponieważ typ tej właściwości zależy od typu hosta, jest to przydatne wyłącznie podczas pisania szablonu tekstu, który działa tylko z określonym hostem. Ma zastosowanie do szablonów czasu projektowania, ale nie szablonów czasu wykonywania.
Gdy hostspecific
używasz true
programu Visual Studio i używasz go, możesz rzutować this.Host
do dostawcy IServiceProvider, aby uzyskać dostęp do funkcji programu Visual Studio. Można również użyć Host.ResolvePath(filename)
polecenia , aby uzyskać ścieżkę bezwzględną pliku w projekcie. Na przykład:
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ output extension=".txt" #>
<#@ assembly name="EnvDTE" #>
<#@ import namespace="EnvDTE" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="Microsoft.VisualStudio.TextTemplating" #>
<# // Get the Visual Studio API as a service:
DTE dte = ((IServiceProvider)this.Host).GetCOMService(typeof(DTE)) as DTE;
#>
Number of projects in this solution: <#= dte.Solution.Projects.Count #>
<#
// Find a path within the current project:
string myFile = File.ReadAllText(this.Host.ResolvePath("MyFile.txt"));
#>
Content of myFile is:
<#= myFile #>
Jeśli używasz inherits
atrybutów i hostspecific
razem, określ host="trueFromBase" w klasie pochodnej i host="true" w klasie bazowej. Pozwala to uniknąć podwójnej definicji Host
właściwości w wygenerowanym kodzie.
Atrybut language
Przykład:
language="VB"
Prawidłowe wartości:
C#
(domyślne)
VB
Atrybut language
określa język (Visual Basic lub Visual C#), który ma być używany dla kodu źródłowego w instrukcjach i blokach wyrażeń. Pliku kodu pośredniego, z którego jest generowane wyjście, użyje tego języka. Język ten nie jest powiązany z językiem generowanym przez szablon, który może być dowolnym rodzajem tekstu.
Na przykład:
<#@ template language="VB" #>
<#@ output extension=".txt" #>
Squares of numbers:
<#
Dim number As Integer
For number = 1 To 4
#>
Square of <#= number #> is <#= number * number #>
<#
Next number
#>
Atrybut inherits
Można określić, aby kod szablonu dziedziczył z innej klasy, która również może być generowana z szablonu tekstu.
Dziedziczenie w szablonie tekstowym czasu wykonywania (wstępnie przetworzonym)
Można użyć dziedziczenia między szablonami tekstowymi czasu wykonywania, aby utworzyć podstawowy szablon, który ma kilka wariantów pochodnych. Szablony czasu wykonywania to szablony, które mają właściwość Custom Tool ustawioną na TextTemplatingFilePreprocessor. Szablon czasu wykonywania generuje kod, który można wywoływać w aplikacji, aby tworzyć tekst zdefiniowany w szablonie. Aby uzyskać więcej informacji, zobacz Generowanie tekstu w czasie wykonywania przy użyciu szablonów tekstu T4.
Jeśli nie określisz atrybutu inherits
, klasa bazowa i klasa pochodna zostaną wygenerowane na podstawie szablonu tekstowego. Po określeniu atrybutu inherits
zostanie wygenerowana tylko klasa pochodna. Klasa bazowa może być napisana odręcznie, ale musi mieć metody, które są używane w klasie pochodnej.
Zazwyczaj można określić inny wstępnie przetworzony szablon jako klasę bazową. Szablon podstawowy dostarcza wspólne bloki tekstu, które mogą się przeplatać z tekstem z szablonów pochodnych. Bloki <#+ ... #>
funkcji klasy umożliwiają definiowanie metod zawierających fragmenty tekstu. Na przykład można umieścić strukturę tekstu wyjściowego w szablonie podstawowym, zapewniającym wirtualne metody, które mogą zostać zastąpione w szablonach pochodnych:
Szablon tekstowy (wstępnie przetworzony) czasu wykonywania BaseTemplate.tt:
This is the common header.
<#
SpecificFragment1();
#>
A common central text.
<#
SpecificFragment2();
#>
This is the common footer.
<#+
// Declare abstract methods
protected virtual void SpecificFragment1() { }
protected virtual void SpecificFragment2() { }
#>
Szablon tekstowy (wstępnie przetworzony) czasu wykonywania DerivedTemplate1.tt:
<#@ template language="C#" inherits="BaseTemplate" #>
<#
// Run the base template:
base.TransformText();
#>
<#+
// Provide fragments specific to this derived template:
protected override void SpecificFragment1()
{
#>
Fragment 1 for DerivedTemplate1
<#+
}
protected override void SpecificFragment2()
{
#>
Fragment 2 for DerivedTemplate1
<#+
}
#>
Kod aplikacji do wywołania DerivedTemplate1:
Console.WriteLine(new DerivedTemplate().TransformText());
Dane wyjściowe:
This is the common header.
Fragment 1 for DerivedTemplate1
A common central text.
Fragment 2 for DerivedTemplate1
This is the common footer.
Można utworzyć klasy podstawowe i pochodne w różnych projektach. Pamiętaj, aby dodać projekt podstawowy lub zestaw do odwołań projektu pochodnego.
Można również użyć zwykłej klasy odręcznej jako klasy bazowej. Klasa bazowa musi dostarczać metody stosowane w klasie pochodnej.
Ostrzeżenie
Jeśli używasz inherits
atrybutów i hostspecific
razem, określ hostpecific="trueFromBase" w klasie pochodnej i host="true" w klasie bazowej. Pozwala to uniknąć podwójnej definicji Host
właściwości w wygenerowanym kodzie.
Dziedziczenie w szablonie tekstowym czasu projektowania
Szablon tekstowy czasu projektowania to plik, dla którego narzędzie niestandardowe ma ustawioną wartość TextTemplatingFileGenerator. Szablon generuje plik wyjściowy kodu lub tekstu, który stanowi część projektu programu Visual Studio. Aby wygenerować plik wyjściowy, szablon najpierw jest tłumaczony na plik kodu programu pośredniego, którego zwykle nie widać. Atrybut inherits
określa klasę bazową dla tego kodu pośredniego.
W przypadku szablonu tekstowego czasu projektowania można określić dowolną klasę bazową pochodzącą z Microsoft.VisualStudio.TextTemplating.TextTransformationklasy . Użyj dyrektywy , <#@assembly#>
aby załadować zestaw lub projekt zawierający klasę bazową.
Aby uzyskać więcej informacji, zobacz "Dziedziczenie w szablonach tekstowych" w blogu Garetha Jonesa.
linePragmas, atrybut
Przykład:
linePragmas="false"
Prawidłowe wartości:
true
(domyślne)
false
Ustawienie tego atrybutu na false powoduje usunięcie znaczników, które identyfikują numery wierszy w wygenerowanym kodzie. Oznacza to, że kompilator będzie zgłaszał błędy, używając numerów wierszy wygenerowanego kodu. Daje to więcej opcji debugowania, ponieważ można wybrać debugowanie szablonu tekstu lub wygenerowanego kodu.
Ten atrybut może również pomóc, jeśli znajdujesz bezwzględne nazwy plików w pragmas powoduje rozpraszanie scalania w ramach kontroli kodu źródłowego.
atrybut widoczności
Przykład:
visibility="internal"
Prawidłowe wartości:
public
(domyślne)
internal
W szablonie tekstowym czasu wykonywania, ustawia atrybut widoczności wygenerowanej klasy. Domyślnie klasa jest częścią publicznego interfejsu API kodu, ale ustawiając visibility="internal"
ustawienie, możesz upewnić się, że tylko kod może używać klasy generowania tekstu.