Share via


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!"를 4번 출력합니다.

<#
    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" #>

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

자세한 내용은 T4 Import 지시문을 참조하십시오.

코드 및 텍스트 포함

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 데이터를 읽는 데 사용할 수 있는 클래스 집합을 만들 수도 있습니다.

다이어그램 또는 폼에서 모델 파일을 편집합니다. Domain-Specific Language Tools에서는 모델을 다이어그램 또는 Windows Form으로 편집할 수 있는 도구를 제공합니다. 그러면 생성된 응용 프로그램의 사용자와 모델에 대해 보다 쉽게 논의할 수 있습니다. Domain-Specific Language Tools에서는 모델 구조를 반영하는 강력한 형식의 클래스 집합도 만듭니다. 자세한 내용은 Generating Code from a Domain-Specific Language을 참조하십시오.

UML 모델을 사용합니다. UML 모델에서 코드를 생성할 수 있습니다. 이 경우 익숙한 표기법을 사용해 모델을 다이어그램으로 편집할 수 있다는 이점이 있습니다. 또한 다이어그램을 디자인하지 않아도 됩니다. 자세한 내용은 방법: UML 모델에서 파일 생성을 참조하십시오.

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

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

<#@ 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 #>

호스트가 제공하는 다른 서비스도 가져올 수 있습니다. 자세한 내용은 Accessing Visual Studio or other Hosts from a Template을 참조하십시오.

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

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

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

템플릿 편집

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

관련 항목

작업

항목

템플릿을 작성합니다.

T4 텍스트 템플릿 작성 지침

프로그램 코드를 사용하여 텍스트를 생성합니다.

T4 텍스트 템플릿 쓰기

Visual Studio 솔루션에서 파일을 생성합니다.

T4 텍스트 템플릿을 사용하여 디자인 타임 코드 생성

Visual Studio 외부에서 텍스트 생성을 실행합니다.

TextTransform 유틸리티 사용하여 파일 생성

DSL(Domain-Specific Language) 형식으로 데이터를 변환합니다.

Generating Code from a Domain-Specific Language

고유한 데이터 소스를 변환하는 지시문 프로세서를 작성합니다.

T4 텍스트 변환 사용자 지정