T4 텍스트 템플릿 디버깅
텍스트 템플릿에 중단점을 설정할 수 있습니다. 디자인 타임 텍스트 템플릿을 디버그하려면 텍스트 템플릿 파일을 저장한 다음 솔루션 탐색기의 파일 바로 가기 메뉴에서 T4 템플릿 디버그를 선택합니다. 런타임 텍스트 템플릿을 디버그하려면 해당 템플릿이 속한 애플리케이션을 디버그하면 됩니다.
텍스트 템플릿을 디버그하기 위해서는 템플릿 변환 프로세스의 단계를 이해해야 합니다. 각 단계에서 다양한 종류의 오류가 발생할 수 있습니다. 단계는 다음과 같습니다.
단계 | 디자인 타임 템플릿: 발생 시기 | 런타임 템플릿: 발생 시기 |
---|---|---|
텍스트 템플릿에서 코드를 생성합니다. 지시문의 오류 또는 일치하지 않거나 순서가 잘못 지정된 <#...#> 태그. |
템플릿을 저장하거나 텍스트 변환을 호출할 때 | 템플릿을 저장하거나 텍스트 변환을 호출할 때 |
생성된 코드를 컴파일합니다. 템플릿 코드의 컴파일 오류 |
이전 단계 바로 다음에 | 애플리케이션 코드와 함께 |
코드를 실행합니다. 템플릿 코드의 런타임 오류 |
이전 단계 바로 다음에 | 애플리케이션을 실행하고 템플릿 코드를 호출할 때 |
대부분의 경우 오류 보고서에서 템플릿 코드의 줄 번호가 제공됩니다. 오류 보고서가 임시 파일 이름을 참조하는 경우 텍스트 템플릿의 코드에 일치하지 않는 대괄호가 있는 것이 일반적인 원인입니다.
텍스트 템플릿에 중단점을 설정하고 일반적인 방법으로 디버그할 수 있습니다.
일반적인 오류 및 해결 방법
다음 표에는 가장 일반적인 오류 및 해결 방법이 나타나 있습니다.
오류 메시지 | 설명 | 솔루션 |
---|---|---|
Transformation 클래스가 상속하는 기본 클래스 '{0}'을(를) 로드하지 못했습니다. | 템플릿 지시문의 inherits 매개 변수에 지정된 기본 클래스를 찾을 수 없으면 발생합니다. 메시지는 템플릿 지시문의 줄 번호를 제공합니다. |
지정된 클래스가 존재하고 해당 클래스가 있는 어셈블리가 어셈블리 지시문에 지정되어 있는지 확인합니다. |
{0} 파일에 대한 포함 텍스트를 확인하지 못했습니다. | 포함된 템플릿을 찾을 수 없으면 발생합니다. 메시지는 요청된 포함 파일의 이름을 제공합니다. | 파일 경로가 원래 템플릿 경로에 상대적이거나 파일이 호스트에 등록된 위치에 있거나 파일에 대한 전체 경로가 있는지 확인합니다. |
변환 개체를 초기화할 때 오류가 발생했습니다. 변환이 실행되지 않습니다. | Transformation 클래스의 'Initialize()'가 실패하거나 false를 반환하면 발생합니다. | Initialize() 함수의 코드는 <#@template#> 지시문에 지정된 기본 변환 클래스와 지시문 프로세서에서 가져옵니다. 오류 목록에 초기화가 실패한 오류가 있을 수 있습니다. 실패한 이유를 조사합니다. 템플릿을 디버그하는 절차에 따라 Initialize()에 대해 생성된 실제 코드를 살펴볼 수 있습니다. |
지시문 프로세서 '{1}'에 대한 어셈블리 '{0}'에 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는 각 템플릿 줄에 대해 하나의 문자열 리터럴을 사용하여 텍스트 블록을 문자열 연결 식으로 변환합니다. 매우 긴 텍스트 블록은 컴파일러의 크기 제한을 초과할 수 있습니다. | 다음과 같은 식 블록을 사용하여 긴 텍스트 블록을 분할합니다.<#= "" #> |
경고 설명 및 해결 방법
다음 표에는 가장 자주 발생하는 경고와 해결 방법(있는 경우)이 나타나 있습니다.
경고 메시지 | 설명 | 솔루션 |
---|---|---|
포함 파일 '{0}’을(를) 로드하는 동안 Null 또는 빈 문자열이 반환되었습니다. | 포함된 텍스트 템플릿 파일이 비어 있으면 발생합니다. 메시지는 포함된 파일의 파일 이름을 제공합니다. | include 지시문을 제거합니다. 또는 파일에 내용이 포함되어 있어야 합니다. |
변환 컴파일 중: | 변환을 컴파일할 때 컴파일러에서 발생하는 모든 오류 또는 경고 앞에 이 문자열을 표시합니다. 이 문자열은 컴파일러가 오류 또는 경고를 throw했음을 의미합니다. | DLL을 찾는 데 문제가 있는 경우 DLL이 GAC에 있으면 전체 경로 또는 정규화된 강력한 이름을 제공해야 할 수 있습니다. |
'{0}' 매개 변수가 이미 지시문에 있습니다. 중복된 매개 변수는 무시됩니다. | 지시문에서 매개 변수가 두 번 이상 지정되면 발생합니다. 메시지는 매개 변수의 이름과 지시문의 줄 번호를 제공합니다. | 중복 매개 변수 사양을 제거합니다. |
포함 파일 '{0}'을(를) 로드하는 동안 오류가 발생했습니다. include 지시문은 무시됩니다. | include 지시문에 지정된 파일을 찾을 수 없으면 발생합니다. 메시지는 파일의 이름과 지시문의 줄 번호를 제공합니다. |
포함 파일이 원래 텍스트 템플릿 파일과 동일한 디렉터리에 있거나 호스트에 등록된 포함 디렉터리 중 하나에 있는지 확인합니다. |
Transformation 클래스에 대해 잘못된 기본 클래스를 지정했습니다. 기본 클래스는 Microsoft.VisualStudio.TextTemplating.TextTransformation에서 파생되어야 합니다. | 템플릿 지시문의 inherits 매개 변수가 TextTransformation 에서 상속하지 않는 클래스를 지정하면 발생합니다. 메시지는 템플릿 지시문의 줄 번호를 제공합니다. |
TextTransformation 에서 파생되는 클래스를 지정합니다. |
'template' 지시문에 잘못된 문화권이 지정되었습니다. 문화권은 "xx-XX" 형식이어야 합니다. 고정 문화권이 사용됩니다. | 템플릿 지시문의 문화권 매개 변수가 잘못 지정되면 발생합니다. 메시지는 템플릿 지시문의 줄 번호를 제공합니다. | culture 매개 변수를 "xx-XX" 형식의 유효한 문화권으로 변경합니다. |
템플릿 지시문에 잘못된 디버그 값 '{0}'이(가) 지정되었습니다. 디버그 값은 “true” 또는 “false”여야 합니다. 기본값 "false"가 사용됩니다. | 템플릿 지시문의 debug 매개 변수가 잘못 지정되면 발생합니다. 메시지는 템플릿 지시문의 줄 번호를 제공합니다. |
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}'(이)라는 프로세서를 찾을 수 없습니다. 해당 지시문이 무시됩니다. | 시스템이 custom 지시문 내에 지정된 directive 프로세서를 찾을 수 없으면 발생합니다. 메시지는 지시문 이름, 프로세서 이름, 지시문의 줄 번호를 제공합니다. |
지시문의 processor 특성을 지시문 프로세서의 이름으로 설정합니다. |
지시문 '{1}'에 필요한 {0} 매개 변수를 찾을 수 없습니다. 해당 지시문이 무시됩니다. | 시스템이 필수 지시문 매개 변수를 제공하지 않으면 발생합니다. 메시지는 누락된 매개 변수의 이름, 지시문 이름, 줄 번호를 제공합니다. | 누락된 매개 변수를 제공합니다. |
'{0}'(이)라는 프로세서가 '{1}'(이)라는 지시문을 지원하지 않습니다. 해당 지시문이 무시됩니다. | 지시문 프로세서가 지시문을 지원하지 않으면 발생합니다. 메시지는 위반 지시문 이름 및 줄 번호와 지시문 프로세서의 이름을 제공합니다. | 지시문의 이름을 수정합니다. |
'{0}' 파일에 대한 include 지시문에 무한 루프가 발생합니다. | 순환 include 지시문이 지정되면(예: 파일 A에 파일 A가 포함되고 파일 B에 파일 A가 포함됨) 표시됩니다. | 순환 include 지시문을 지정하지 마세요. |
변환 실행 중: | 변환을 실행하는 동안 생성된 모든 오류 또는 경고 앞에 이 문자열을 추가합니다. | 해당 없음. |
블록 내에서 예기치 않은 시작 또는 끝 태그가 발견되었습니다. 시작 또는 끝 태그를 잘못 입력하지 않았는지, 템플릿에 중첩된 블록이 없는지 확인합니다. | 예기치 않은 <# 또는 #>가 있는 경우 표시됩니다. 즉, 닫히지 않은 다른 열린 태그 뒤에 <#이 있거나 그 앞에 닫히지 않은 열린 태그가 없을 때 #>가 있는 경우입니다. 메시지는 일치하지 않는 태그의 줄 번호를 제공합니다. | 일치하지 않는 시작 또는 끝 태그를 제거하거나 이스케이프 문자를 사용합니다. |
지시문이 잘못된 형식으로 지정되었습니다. 해당 지시문이 무시됩니다. 지시문을 <#@ name [parametername="parametervalue"]* #> 형식으로 지정하세요. |
지시문이 올바른 형식으로 지정되지 않은 경우 파서에 표시됩니다. 메시지는 잘못된 지시문의 줄 번호를 제공합니다. | 모든 지시문이 <#@ name [parametername="parametervalue"]* #> 형식인지 확인합니다. 자세한 내용은 T4 텍스트 템플릿 지시문을 참조하세요. |
등록된 지시문 프로세서 '{1}'에 대한 '{0}' 어셈블리를 로드하지 못했습니다 {2} |
호스트가 지시문 프로세서를 로드할 수 없으면 발생합니다. 메시지는 지시문 프로세서에 제공된 어셈블리와 지시문 프로세서의 이름을 제공합니다. | 지시문 프로세서가 올바르게 등록되어 있고 어셈블리가 있는지 확인합니다. |
등록된 지시문 프로세서 '{2}'에 대한 '{1}' 어셈블리에서 '{0}' 형식을 찾지 못했습니다. {3} |
어셈블리에서 지시문 프로세서 형식을 로드할 수 없으면 발생합니다. 메시지는 형식, 어셈블리 및 지시문 프로세서의 이름을 제공합니다. | vshost는 레지스트리에서 지시문 프로세서 정보(이름, 어셈블리, 형식)를 찾습니다. 지시문 프로세서가 올바르게 등록되어 있고 어셈블리에 형식이 있는지 확인합니다. |
'{0}' 어셈블리를 로드하는 동안 문제가 발생했습니다. | 어셈블리를 로드하는 데 문제가 있을 때 발생합니다. 메시지는 어셈블리의 이름을 제공합니다. | 지시문 프로세서가 <@#assembly#> 지시문에 로드할 어셈블리를 지정할 수 있습니다. 이 문자열 뒤에 오는 오류 메시지는 어셈블리 로드가 실패한 이유에 대한 추가 데이터를 제공합니다. |
'{1}'(이)라는 지시문에 대한 프로세서를 만들고 초기화하는 동안 문제가 발생했습니다. 프로세서의 형식은 {0}입니다. 해당 지시문이 무시됩니다. | 시스템이 지시문 프로세서를 만들거나 초기화할 수 없으면 발생합니다. 메시지는 지시문의 이름 및 줄 번호와 프로세서의 형식을 제공합니다. | 올바른 지시문 프로세서를 사용하고 지시문 프로세서에 공용 기본 생성자가 있는지 확인합니다. 또는 디버그 옵션을 사용하여 지시문 프로세서의 Initialize() 메서드가 실패하는 이유를 확인합니다. 자세한 내용은 텍스트 템플릿 문제 해결을 참조하세요. |
'{0}'(이)라는 지시문을 처리하는 동안 예외가 throw되었습니다. | 지시문을 처리할 때 지시문 프로세서가 예외를 throw하면 발생합니다. | 지시문 프로세서에 대한 매개 변수가 올바른지 확인합니다. |
'{0}' 어셈블리 참조를 확인하는 동안 호스트에서 예외를 throw했습니다. | 호스트가 어셈블리 참조를 확인하려고 할 때 예외를 throw하면 발생합니다. 메시지는 어셈블리 참조 문자열을 제공합니다. | 어셈블리 참조는 <@#assembly#> 지시문 및 지시문 프로세서에서 가져옵니다. assembly 매개 변수에 제공된 'name' 매개 변수가 올바른지 확인합니다. |
{2} 지시문에 대해 지원되지 않는 {1} 값 '{0}'을(를) 지정하려고 합니다. | 지원되지 않는 requires 또는 provides 인수를 제공하면 RequiresProvidesDirectiveProcessor(생성된 지시문 프로세서는 모두 여기에서 파생됨)에 의해 발생합니다. | requires 및 provides 매개 변수에서 제공하는 name ='value' 쌍의 이름 올바른지 확인합니다. |