T4 텍스트 템플릿 쓰기

텍스트 템플릿은 해당 템플릿에서 생성될 텍스트를 포함합니다. 예를 들어 웹 페이지를 만드는 템플릿은 “<html>...” 및 HTML 페이지의 기타 모든 표준 부분을 포함합니다. 프로그램 코드 조각인 제어 블록이 템플릿에 삽입됩니다. 제어 블록은 경우에 따라 다른 값을 제공하여 텍스트 부분을 조건부로/반복 적용할 수 있도록 합니다.

이 구조에서는 템플릿을 쉽게 개발할 수 있습니다. 생성된 파일의 프로토타입으로 시작한 다음 상황에 따라 다른 결과를 생성하는 제어 블록을 증분 방식으로 삽입할 수 있기 때문입니다.

텍스트 템플릿은 다음 부분으로 구성됩니다.

  • 지시문 - 템플릿 처리 방법을 제어하는 요소

  • 텍스트 블록 - 출력에 직접 복사되는 콘텐츠

  • 제어 블록 - 변수 값을 텍스트에 삽입하고 텍스트의 조건부 또는 반복 부분을 제어하는 프로그램 코드

이 항목의 예제를 사용하려면 T4 텍스트 템플릿을 사용하여 디자인 타임 코드 생성에 설명된 대로 예제를 템플릿 파일로 복사합니다. 템플릿 파일을 편집하고 저장한 후 출력 .txt 파일을 살펴보면 됩니다.

지시문

텍스트 템플릿 지시문은 변환 코드 및 출력 파일 생성 방법에 대한 일반 명령을 텍스트 템플릿 생성 엔진에 제공합니다.

예를 들어 다음 지시문은 출력 파일의 확장명이 .txt여야 하도록 지정합니다.

<#@ output extension=".txt" #>

지시문에 대한 자세한 내용은 T4 텍스트 템플릿 지시문을 참조하세요.

텍스트 블록

텍스트 블록은 출력 파일에 텍스트를 직접 삽입합니다. 텍스트 블록에는 특수한 서식이 없습니다. 예를 들어 다음 텍스트 템플릿은 "Hello"라는 단어가 포함된 텍스트 파일을 생성합니다.

<#@ output extension=".txt" #>
Hello

제어 블록

제어 블록은 템플릿을 변환하는 데 사용되는 프로그램 코드 섹션입니다. 기본 언어는 C#이지만 Visual Basic을 사용하려는 경우 파일 시작 부분에 다음 지시문을 작성할 수 있습니다.

<#@ template language="VB" #>

제어 블록에서 코드를 작성하는 언어는 생성되는 텍스트의 언어와는 관계가 없습니다.

표준 제어 블록

표준 제어 블록은 출력 파일 부분을 생성하는 프로그램 코드 섹션입니다.

템플릿 파일에서는 텍스트 블록과 표준 제어 블록을 원하는 수만큼 혼합하여 사용할 수 있습니다. 그러나 제어 블록 내에 제어 블록을 배치할 수는 없습니다. 각 표준 제어 블록은 <# ... #> 기호로 구분됩니다.

예를 들어 다음 제어 블록 및 텍스트 블록을 사용하면 출력 파일에 "0, 1, 2, 3, 4 Hello!" 줄이 포함됩니다.

<#
    for(int i = 0; i < 4; i++)
    {
        Write(i + ", ");
    }
    Write("4");
#> Hello!

명시적인 Write() 문을 사용하는 대신 텍스트와 코드를 인터리빙할 수 있습니다. 다음 예제에서는 "Hello!"를 네 번 출력합니다.

<#
    for(int i = 0; i < 4; i++)
    {
#>
Hello!
<#
    }
#>

코드에서 Write(); 문이 허용되는 모든 위치에 텍스트 블록을 삽입할 수 있습니다.

참고 항목

루프 또는 조건문과 같은 복합 문 내에 텍스트 블록을 포함할 때는 항상 중괄호 {...}를 사용하여 텍스트 블록을 포함합니다.

식 제어 블록

식 제어 블록은 식을 평가한 다음 문자열로 변환합니다. 이 문이 출력 파일에 삽입됩니다.

식 제어 블록은 <#= ... #> 기호로 구분됩니다.

예를 들어 다음 제어 블록은 출력 파일에 "5"가 포함되도록 지정합니다.

<#= 2 + 3 #>

여기서 여는 기호에는 “<#=” 3개의 문자가 있습니다.

식은 범위 내의 모든 변수를 포함할 수 있습니다. 예를 들어 다음 블록은 숫자가 포함된 줄을 출력합니다.

<#@ output extension=".txt" #>
<#
    for(int i = 0; i < 4; i++)
    {
#>
This is hello number <#= i+1 #>: Hello!
<#
    }
#>

클래스 기능 제어 블록

클래스 기능 제어 블록은 주 변환에 포함되지 않아야 할 속성, 메서드 또는 기타 코드를 정의합니다. 클래스 기능 블록은 대개 도우미 함수에 사용되며, 보통 별도의 파일에 배치되므로 둘 이상의 텍스트 템플릿에 포함할 수 있습니다.

클래스 기능 제어 블록은 <#+ ... #> 기호로 구분됩니다.

예를 들어 다음 템플릿 파일은 메서드를 선언 및 사용합니다.

<#@ output extension=".txt" #>
Squares:
<#
    for(int i = 0; i < 4; i++)
    {
#>
    The square of <#= i #> is <#= Square(i+1) #>.
<#
    }
#>
That is the end of the list.
<#+   // Start of class feature block
private int Square(int i)
{
    return i*i;
}
#>

클래스 기능은 작성되는 파일 끝에 배치해야 합니다. 그러나 <#@include#> 지시문 뒤에 표준 블록과 텍스트가 있어도 클래스 기능을 포함하는 파일을 include할 수 있습니다.

제어 블록에 대한 자세한 내용은 텍스트 템플릿 제어 블록을 참조하세요.

텍스트 블록을 포함할 수 있는 클래스 기능 블록

텍스트를 생성하는 메서드를 작성할 수 있습니다. 예시:

List of Squares:
<#
   for(int i = 0; i < 4; i++)
   {  WriteSquareLine(i); }
#>
End of list.
<#+   // Class feature block
private void WriteSquareLine(int i)
{
#>
   The square of <#= i #> is <#= i*i #>.
<#+
}
#>

따라서 둘 이상의 템플릿에 포함될 수 있는 텍스트를 별도의 파일에 생성하는 메서드를 배치하는 경우 특히 유용합니다.

외부 정의 사용

어셈블리

템플릿의 코드 블록은 System.dll 등 가장 흔히 사용되는 .NET 어셈블리에 대해 정의되는 형식을 사용할 수 있습니다. 또한 기타 .NET 어셈블리나 고유한 어셈블리를 참조할 수도 있습니다. 다음과 같이 어셈블리의 경로 이름 또는 강력한 이름을 제공할 수 있습니다.

<#@ assembly name="System.Xml" #>

절대 경로 이름을 사용하거나 경로 이름에 표준 매크로 이름을 사용해야 합니다. 예시:

<#@ assembly name="$(SolutionDir)library\MyAssembly.dll" #>

assembly 지시문은 전처리된 텍스트 템플릿에 아무런 영향을 주지 않습니다.

자세한 내용은 T4 Assembly 지시문을 참조하세요.

네임스페이스

import 지시문은 C#의 경우 using 절, Visual Basic의 경우 imports 절과 같습니다. 이 지시문을 사용하면 정규화된 이름을 사용하지 않고도 코드에서 형식을 참조할 수 있습니다.

<#@ import namespace="System.Xml" #>

지시문 assemblyimport은 원하는 수만큼 사용할 수 있습니다. 이러한 지시문은 텍스트 및 제어 블록 앞에 배치해야 합니다.

자세한 내용은 T4 가져오기 지시문을 참조하세요.

코드 및 텍스트 포함

include 지시문은 다른 템플릿 파일의 텍스트를 삽입합니다. 예를 들어 다음 지시문은 test.txt의 내용을 삽입합니다.

<#@ include file="c:\test.txt" #>

포함된 내용은 포함하는 텍스트 템플릿의 일부인 것처럼 처리됩니다. 그러나 include 지시문 뒤에 일반 텍스트와 표준 제어 블록이 있어도 클래스 기능 블록 <#+...#>이 포함된 파일을 포함할 수 있습니다.

자세한 내용은 T4 Include 지시문을 참조하세요.

유틸리티 메서드

제어 블록에서 항상 사용할 수 있는 Write() 등의 여러 메서드가 있습니다. 여기에는 출력 들여쓰기, 오류 보고 등을 위한 메서드가 포함됩니다.

원하는 유틸리티 메서드 집합을 직접 작성할 수도 있습니다.

자세한 내용은 텍스트 템플릿 유틸리티 메서드를 참조하세요.

데이터 및 모델 변환

텍스트 템플릿의 가장 유용한 적용 사례는 모델, 데이터베이스 또는 데이터 파일과 같은 소스의 내용에 따라 자료를 생성하는 것입니다. 템플릿은 데이터를 추출한 다음 서식을 다시 지정합니다. 템플릿 컬렉션은 이러한 소스를 여러 파일로 변환할 수 있습니다.

소스 파일을 읽는 방식은 다양합니다.

텍스트 템플릿에서 파일을 읽습니다. 이는 데이터를 템플릿으로 가져오는 가장 단순한 방법입니다.

<#@ import namespace="System.IO" #>
<# string fileContent = File.ReadAllText(@"C:\myData.txt"); ...

파일을 탐색 가능한 모델로 로드합니다. 즉, 텍스트 템플릿 코드가 탐색할 수 있는 모델로 데이터를 읽는 보다 효율적인 방식을 사용할 수 있습니다. 예를 들어 XML 파일을 로드한 다음 XPath 식을 사용하여 탐색할 수 있습니다. 또한 xsd.exe를 사용하여 XML 데이터를 읽을 수 있는 클래스 집합을 만들 수 있습니다.

다이어그램 또는 양식에서 모델 파일을 편집합니다. 도메인 특정 언어 도구에서는 모델을 다이어그램 또는 Windows 양식으로 편집할 수 있는 도구를 제공합니다. 그러면 생성된 애플리케이션의 사용자와 모델에 대해 보다 쉽게 논의할 수 있습니다. 또한 도메인 특정 언어 도구에서는 모델 구조를 반영하는 강력한 형식의 클래스 세트를 만듭니다. 자세한 내용은 도메인 특정 언어에서 코드 생성을 참조하세요.

디자인 타임 템플릿의 상대 파일 경로

디자인 타임 텍스트 템플릿에서는 텍스트 템플릿을 기준으로 하는 위치의 파일을 참조하려는 경우 this.Host.ResolvePath()를 사용합니다. 또한 hostspecific="true" 지시문에서 template도 설정해야 합니다.

<#@ template hostspecific="true" language="C#" #>
<#@ output extension=".txt" #>
<#@ import namespace="System.IO" #>
<#
 // Find a path within the same project as the text template:
 string myFile = File.ReadAllText(this.Host.ResolvePath("MyFile.txt"));
#>
Content of MyFile.txt is:
<#= myFile #>

호스트가 제공하는 다른 서비스도 가져올 수 있습니다. 자세한 내용은 템플릿에서 Visual Studio 또는 다른 호스트 액세스를 참조하세요.

별도의 AppDomain에서 실행되는 디자인 타임 텍스트 템플릿

디자인 타임 텍스트 템플릿은 주 애플리케이션과는 별도의 AppDomain에서 실행됩니다. 이러한 방식은 대부분의 경우 중요하지 않지만 복잡한 코드를 사용하는 특정 사례에서는 제한이 적용될 수 있습니다. 예를 들어 별도의 서비스에서 템플릿 내부나 외부로 데이터를 전달하려는 경우 해당 서비스가 serializable API를 제공해야 합니다.

코드의 나머지 부분과 함께 컴파일되는 코드를 제공하는 런타임 텍스트 템플릿의 경우에는 이 제한이 적용되지 않습니다.

템플릿 편집

확장 관리자 온라인 갤러리에서 특수한 텍스트 템플릿 편집기를 다운로드할 수 있습니다. 도구 메뉴에서 확장 관리자를 클릭합니다. 온라인 갤러리를 클릭한 후 검색 도구를 사용합니다.