다음을 통해 공유


T4 텍스트 템플릿 디버깅

텍스트 템플릿에서 중단점을 설정할 수 있습니다. 디자인 타임 텍스트 템플릿을 디버그하려면 텍스트 템플릿 파일을 저장한 다음 솔루션 탐색기에서 파일의 바로 가기 메뉴에서 T4 템플릿 디버그 를 선택합니다. 런타임 텍스트 템플릿을 디버그하려면 해당 템플릿이 속한 애플리케이션을 디버그하기만 하면 됩니다.

텍스트 템플릿을 디버그하려면 템플릿 변환 프로세스의 단계를 이해해야 합니다. 각 단계에서 다양한 종류의 오류가 발생할 수 있습니다. 단계는 다음과 같습니다.

Step 디자인 타임 템플릿: 발생 시점 런타임 템플릿: 발생하는 경우
코드는 텍스트 템플릿에서 생성됩니다.

지시문의 오류 또는 일치하지 않거나 잘못된 <#...#> 태그입니다.
템플릿을 저장하거나 텍스트 변환을 호출할 때 템플릿을 저장하거나 텍스트 변환을 호출할 때
생성된 코드가 컴파일됩니다.

템플릿 코드의 컴파일 오류입니다.
이전 단계 직후입니다. 애플리케이션 코드와 함께.
코드가 실행됩니다.

템플릿 코드의 런타임 오류입니다.
이전 단계 직후입니다. 애플리케이션이 실행되고 템플릿 코드를 호출하는 경우

대부분의 경우 템플릿 코드의 줄 번호는 오류 보고서에 제공됩니다. 오류 보고서가 임시 파일 이름을 참조하는 경우 일반적인 원인은 텍스트 템플릿의 코드에서 일치하지 않는 대괄호입니다.

텍스트 템플릿에서 중단점을 설정하고 일반적인 방식으로 디버그할 수 있습니다.

일반적인 오류 및 수정

다음 표에서는 가장 일반적인 오류 및 수정 사항을 나열합니다.

오류 메시지 Description 해결 방법
변환 클래스가 상속하는 기본 클래스 '{0}'를 로드하지 못했습니다. 템플릿 지시문의 매개 변수에 지정된 기본 클래스를 inherits 찾을 수 없는 경우 발생합니다. 이 메시지는 템플릿 지시문의 줄 번호를 제공합니다. 지정된 클래스가 있고 해당 클래스가 있는 어셈블리가 어셈블리 지시문에 지정되어 있는지 확인합니다.
파일의 포함 텍스트를 해결하지 못했습니다.{0} 포함된 템플릿을 찾을 수 없을 때 발생합니다. 메시지는 요청된 include 파일의 이름을 제공합니다. 파일 경로가 원래 템플릿 경로에 상대적이거나 파일이 호스트에 등록된 위치에 있거나 파일에 대한 전체 경로가 있는지 확인합니다.
변환 개체를 초기화할 때 오류가 생성되었습니다. 변환이 실행되지 않습니다. 변환 클래스의 'Initialize()'가 실패하거나 false를 반환할 때 발생합니다. Initialize() 함수의 코드는 #@template#< 지시문에 >지정된 기본 변환 클래스와 지시문 프로세서에서 가져옵니다. 초기화가 실패하게 된 오류는 오류 목록에 있는 것일 수 있습니다. 실패한 이유를 조사합니다. 템플릿을 디버그하는 절차에 따라 Initialize()에 대해 생성된 실제 코드를 확인할 수 있습니다.
지시문 프로세서 '{0}'에 대한 어셈블리 ''{1}에 FullTrust 권한 집합이 부여되지 않았습니다. 신뢰할 수 있는 어셈블리만 지시문 프로세서를 제공할 수 있습니다. 이 지시문 프로세서는 로드되지 않습니다. 시스템에서 지시문 프로세서를 포함하는 어셈블리에 FullTrust 권한을 부여하지 않을 때 발생합니다. 메시지는 어셈블리의 이름과 지시문 프로세서의 이름을 제공합니다. 로컬 컴퓨터에서 신뢰할 수 있는 어셈블리만 사용해야 합니다.
경로 '{0}'는 이 컴퓨터의 로컬 경로이거나 신뢰할 수 있는 영역의 일부여야 합니다. 지시문 또는 어셈블리 지시문이 로컬 컴퓨터 또는 네트워크의 신뢰할 수 있는 영역에 없는 파일을 참조할 때 발생합니다. 지시문 또는 어셈블리 지시문이 있는 디렉터리가 신뢰할 수 있는 영역에 있는지 확인합니다. Internet Explorer를 통해 신뢰할 수 있는 영역에 네트워크 디렉터리를 추가할 수 있습니다.
"‘catch’의 유효하지 않은 토큰 또는 ‘네임스페이스에 멤버를 직접 포함할 수 없습니다’와 같은 여러 가지 구문 오류" 템플릿 코드에 닫는 중괄호가 너무 많습니다. 컴파일러가 표준 생성 코드와 혼동합니다. 코드 구분 기호 내의 닫는 중괄호 및 대괄호 수를 확인합니다.
루프 또는 조건부가 올바르게 컴파일되거나 실행되지 않았습니다. 예: <#if (i>10)#> Number is: <#= i #>.

이 코드는 항상 i 값을 출력합니다. "Number is:"만 조건부입니다.
C#에서는 항상 중괄호를 사용하여 제어 문에 포함된 텍스트 블록을 둘러쌉니다. 중괄호 추가: <#if (i>10) { #> Number is: <#= i #><# } #>.
"디자인 타임 템플릿을 처리하거나 런타임(전처리) 템플릿을 컴파일할 때 '식이 너무 복잡합니다'."

Visual Studio는 런타임 템플릿에서 생성된 코드를 검사하려고 할 때 작동을 중지합니다.
텍스트 블록이 너무 깁니다. T4는 각 템플릿 줄에 대해 하나의 문자열 리터럴을 사용하여 텍스트 블록을 문자열 연결 식으로 변환합니다. 매우 긴 텍스트 블록은 컴파일러의 크기 제한을 초과할 수 있습니다. 다음과 같은 식 블록으로 긴 텍스트 블록을 분리합니다.

<#= "" #>

경고 설명 및 수정 사항

다음 표에서는 가능한 경우 수정 사항과 함께 가장 일반적인 경고를 나열합니다.

경고 메시지 Description 해결 방법
include 파일 ''{0}을 로드하면 null 또는 빈 문자열이 반환되었습니다. 포함된 텍스트 템플릿 파일이 비어 있으면 발생합니다. 메시지는 포함된 파일의 파일 이름을 제공합니다. include 지시문을 제거하거나 파일에 일부 콘텐츠가 있는지 확인합니다.
컴파일 변환 작업 변환을 컴파일할 때 컴파일러에서 발생하는 모든 오류 또는 경고 앞에 이 문자열을 추가합니다. 이 문자열은 컴파일러가 오류 또는 경고를 throw했음을 의미합니다. DLL을 찾는 데 문제가 있는 경우 DLL이 GAC에 있는 경우 전체 경로 또는 정규화된 강력한 이름을 제공해야 할 수 있습니다.
'{0}' 매개 변수가 지시문에 이미 있습니다. 중복 매개 변수는 무시됩니다. 지시문에서 매개 변수를 두 번 이상 지정하면 발생합니다. 메시지는 매개 변수의 이름과 지시문의 줄 번호를 제공합니다. 중복 매개 변수 사양을 제거합니다.
include 파일 ''{0}을 로드하는 동안 오류가 발생했습니다. include 디렉티브는 무시됩니다. 지시문에 include 지정된 파일을 찾을 수 없는 경우에 발생합니다. 메시지는 파일의 이름과 지시문의 줄 번호를 제공합니다. 포함 파일이 원본 텍스트 템플릿 파일과 동일한 디렉터리 또는 호스트에 등록된 포함 디렉터리 중 하나에 있는지 확인합니다.
Transformation 클래스에 잘못된 기본 클래스가 지정되었습니다. 기본 클래스는 Microsoft.VisualStudio.TextTemplating.TextTransformation에서 파생되어야 합니다. 템플릿 지시문의 inherits 매개 변수가 상속 TextTransformation되지 않는 클래스를 지정할 때 발생합니다. 이 메시지는 템플릿 지시문의 줄 번호를 제공합니다. 에서 TextTransformation파생되는 클래스를 지정합니다.
'template' 지시문에 잘못된 문화권이 지정되었습니다. 문화권은 "xx-XX" 형식이어야 합니다. 불변 문화권을 사용할 것입니다. 템플릿 지시문의 문화권 매개 변수를 잘못 지정하면 발생합니다. 이 메시지는 템플릿 지시문의 줄 번호를 제공합니다. 문화권 매개 변수를 "xx-XX" 형식의 유효한 문화권으로 변경합니다.
템플릿 지시문에 잘못된 디버그 값 '{0}'이(가) 지정되었습니다. 디버그 값은 "true" 또는 "false"여야 합니다. 기본값인 "false"가 사용됩니다. 템플릿 지시문의 debug 매개 변수를 잘못 지정하면 발생합니다. 이 메시지는 템플릿 지시문의 줄 번호를 제공합니다. 디버그 매개 변수를 "true" 또는 "false"로 설정합니다.
템플릿 지시문에 잘못된 HostSpecific 값 '{0}'이(가) 지정되었습니다. HostSpecific 값은 "true" 또는 "false"여야 합니다. 기본값인 "false"가 사용됩니다. 지시문의 호스트별 매개 변수를 template 잘못 지정하면 발생합니다. 이 메시지는 템플릿 지시문의 줄 번호를 제공합니다. 호스트별 매개 변수를 "true" 또는 "false"로 설정합니다.
'template' 지시문에 잘못된 언어 '{0}'가 지정되었습니다. 언어는 "C#" 또는 "VB"여야 합니다. "C#"의 기본값이 사용됩니다. 지원되지 않는 언어가 지시문에 template 지정될 때 발생합니다. "C#" 또는 "VB"만 허용됩니다(대/소문자를 구분하지 않습니다). 이 메시지는 템플릿 지시문의 줄 번호를 제공합니다. language 템플릿 지시문의 매개 변수를 "C#" 또는 "VB"로 설정합니다.
템플릿에서 여러 출력 지시문이 발견되었습니다. 첫 번째를 제외한 모든 항목은 무시됩니다. 템플릿 파일에 여러 output 지시문을 지정하면 발생합니다. 메시지는 중복 출력 지시문의 줄 번호를 제공합니다. 중복 output 지시문을 제거합니다.
템플릿에서 여러 템플릿 지시문이 발견되었습니다. 첫 번째를 제외한 모든 항목은 무시됩니다. 템플릿 지시문에 대한 여러 매개 변수는 하나의 템플릿 지시문 내에서 지정해야 합니다. 텍스트 템플릿 파일 내에서 여러 template 지시문을 지정하는 경우(포함된 파일 포함) 발생합니다. 메시지는 중복 템플릿 지시문의 줄 번호를 제공합니다. 다른 template 지시문을 하나의 template 지시문으로 집계합니다.
''{0}라는 지시문에 대한 프로세서가 지정되지 않았습니다. 지시문은 무시됩니다. custom 명령문을 지정하지만 processor 속성을 제공하지 않으면 발생합니다. 메시지는 지시문의 이름과 줄 번호를 제공합니다. 지시문에 사용할 프로세서 이름으로 지정된 directive 특성을 processor에 제공합니다.
'{1}'이라는 지시문에 대한 프로세서 '{0}'를 찾을 수 없습니다. 지시문은 무시됩니다. 시스템에서 directive 프로세서를 지정한 custom 지시문 내에서 찾을 수 없을 때 발생합니다. 메시지는 지시문 이름, 프로세서 이름 및 지시문의 줄 번호를 제공합니다. 지시문의 processor 특성을 지시문 프로세서의 이름으로 설정합니다.
지시문 ''{0}에 대한 필수 매개 변수 '{1}'를 찾을 수 없습니다. 지시문은 무시됩니다. 시스템에서 필수 지시문 매개 변수를 제공하지 않을 때 발생합니다. 메시지는 누락된 매개 변수의 이름, 지시문 이름 및 줄 번호를 제공합니다. 누락된 매개 변수를 제공합니다.
프로세서 '{0}'은(는) '{1}' 지시문을 지원하지 않습니다. 지시문은 무시됩니다. 지시문 프로세서가 지시문을 지원하지 않을 때 발생합니다. 메시지는 지시문 프로세서의 이름과 함께 잘못된 지시문의 이름과 줄 번호를 제공합니다. 지시문의 이름을 수정합니다.
'{0}' 파일에 대한 include 지시문은 무한 루프를 발생합니다. 순환 포함 지시문이 지정되면 표시됩니다(예: 파일 A가 파일 B를 포함하고, 파일 B가 파일 A를 포함하는 경우). 순환 포함 지시문을 지정하지 마세요.
실행 중인 변환: 변환을 실행하는 동안 생성된 모든 오류 또는 경고 앞에 이 문자열을 추가합니다. 적용할 수 없습니다.
블록 내에서 예기치 않은 시작 또는 끝 태그가 발견되었습니다. 시작 또는 끝 태그를 잘못 입력하지 않았는지, 템플릿에 중첩된 블록이 없는지 확인합니다. 예기치 않은 <# 또는 #>이 있으면 표시됩니다. 즉, 닫혀 있지 않은 다른 열린 태그 뒤에 <#이 있거나 앞에 닫혀 있지 않은 열린 태그가 없을 때 #>이 있는 경우입니다. 메시지는 일치하지 않는 태그의 줄 번호를 제공합니다. 일치하지 않는 시작 또는 끝 태그를 제거하거나 이스케이프 문자를 사용합니다.
지시문이 잘못된 형식으로 지정되었습니다. 지시문은 무시됩니다. 지시문을 형식으로 지정하세요. <#@ name [parametername="parametervalue"]* #> 지시문이 올바른 형식으로 지정되지 않은 경우 파서에 의해 표시됩니다. 메시지는 잘못된 지시문의 줄 번호를 제공합니다. 모든 지시문이 형식 <#@ name [parametername="parametervalue"]* #>인지 확인합니다. 자세한 내용은 T4 텍스트 템플릿 지시문을 참조하세요.
등록된 지시문 프로세서 '{0}'에 대한 어셈블리 '{1}'를 로드하지 못했습니다.

{2}
호스트에서 지시문 프로세서를 로드할 수 없는 경우에 발생합니다. 메시지는 지시문 프로세서에 제공된 어셈블리와 지시문 프로세서의 이름을 식별합니다. 지시문 프로세서가 올바르게 등록되어 있고 어셈블리가 있는지 확인합니다.
등록된 지시문 프로세서 '{2}'를 위한 어셈블리 '{1}'에서 '{0}' 형식을 찾지 못했습니다.

{3}
지시문 프로세서 형식을 어셈블리에서 로드할 수 없는 경우에 발생합니다. 메시지는 형식, 어셈블리 및 지시문 프로세서의 이름을 제공합니다. vshost는 레지스트리에서 지시문 프로세서 정보(이름, 어셈블리 및 형식)를 찾습니다. 지시문 프로세서가 올바르게 등록되어 있고 해당 형식이 어셈블리에 있는지 확인합니다.
'{0}' 어셈블리를 로드하는 동안 문제가 발생했습니다. 어셈블리를 로드하는 데 문제가 있을 때 발생합니다. 메시지는 어셈블리의 이름을 제공합니다. <@#assembly#> 지시문과 지시문 프로세서에서 로드할 어셈블리를 지정할 수 있습니다. 이 문자열 뒤에 오는 오류 메시지는 어셈블리 로드가 실패한 이유에 대한 더 많은 데이터를 제공해야 합니다.
''{1}라는 지시문에 대한 프로세서를 만들고 초기화하는 데 문제가 있었습니다. 프로세서의 유형은 .입니다 {0}. 지시문은 무시됩니다. 시스템에서 지시문 프로세서를 만들거나 초기화할 수 없는 경우에 발생합니다. 메시지는 지시문의 이름 및 줄 번호와 프로세서의 형식을 제공합니다. 올바른 지시문 프로세서를 사용하고 지시문 프로세서에 공용 기본 생성자가 있는지 확인합니다. 그렇지 않으면 디버그 옵션을 사용하여 지시문 프로세서의 Initialize() 메서드가 실패하는 이유를 확인합니다. 자세한 내용은 텍스트 템플릿 문제 해결을 참조하세요.
{0}'라는 지시문을 처리하는 동안 예외가 발생되었습니다. 지시문을 처리할 때 지시문 프로세서가 예외를 throw할 때 발생합니다. 지시문 프로세서에 대한 매개 변수가 올바른지 확인합니다.
호스트가 어셈블리 참조 '{0}'를 해결하는 중에 예외를 발생시켰습니다. 호스트가 어셈블리 참조를 확인하려고 시도할 때 예외를 던지면 발생합니다. 메시지는 어셈블리 참조 문자열을 제공합니다. 어셈블리 참조는 <@#assembly#> 지시문 및 지시문 프로세서에서 발생합니다. 어셈블리 매개 변수에 제공된 'name' 매개 변수가 올바른지 확인합니다.
지원되지 않는 값을 '{0}' 지시문 {2}에 지정하려고 시도합니다 {1} 지원되지 않는 requires 또는 provides 인수를 제공할 때, RequiresProvidesDirectiveProcessor(모든 생성된 지시문 프로세서는 여기에서 파생됨)에 의해 발생합니다. 요구 사항 및 제공 매개 변수에 제공된 name='value' 쌍의 이름이 올바른지 확인합니다.