텍스트 템플릿에서 중단점을 설정할 수 있습니다. 디자인 타임 텍스트 템플릿을 디버그하려면 텍스트 템플릿 파일을 저장한 다음 솔루션 탐색기에서 파일의 바로 가기 메뉴에서 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' 쌍의 이름이 올바른지 확인합니다. |