T4 텍스트 템플릿 디버깅
텍스트 서식 파일에서 중단점을 설정할 수 있습니다.디자인 타임 텍스트 템플릿을 디버깅 하려면 T4 템플릿 디버깅 는 텍스트 템플릿 파일을 솔루션 탐색기에서의 바로 가기 메뉴입니다.런타임 텍스트 템플릿을 디버깅 하려면 단순히 속한 응용 프로그램을 디버깅 합니다.
텍스트 템플릿을 디버깅 하려면 템플릿 변환 프로세스의 단계를 이해 해야 합니다.다른 종류의 오류는 각 단계에서 발생할 수 있습니다.두 단계는 다음과 같습니다.
단계 |
디자인 타임 템플릿:이 경우 |
런타임 템플릿에서:이 경우 |
---|---|---|
코드는 텍스트 템플릿에서 생성 됩니다. 지시문에서 오류 또는 불일치 또는 disordered <#…#> 태그입니다. |
서식 파일 저장 또는 텍스트 변환을 호출 합니다. |
서식 파일 저장 또는 텍스트 변환을 호출 합니다. |
생성 된 코드를 컴파일합니다. 템플릿 코드의 컴파일 오류입니다. |
바로 이전 단계 이후에. |
응용 프로그램 코드와 함께. |
코드를 실행합니다. 템플릿 코드에서 런타임 오류가 있습니다. |
바로 이전 단계 이후에. |
응용 프로그램 실행 하 고 템플릿 코드를 호출 합니다. |
대부분의 경우 템플릿 코드의 줄 번호가 오류 보고서에 제공됩니다.오류 보고서에서 임시 파일 이름을 참조하는 경우 일반적인 원인은 텍스트 템플릿 코드에서 대괄호가 일치하지 않기 때문입니다.
텍스트 서식 파일에서 중단점을 설정 하 고 일반적인 방법으로 디버깅할 수 있습니다.
일반적인 오류 및 수정
다음 표에서는 가장 일반적인 오류와 해당 수정 프로그램을 보여줍니다.
오류 메시지 |
설명 |
해결책 |
---|---|---|
변환 클래스를 상속하는 기본 클래스 '{0}'을(를) 로드하지 못했습니다. |
템플릿 지시문의 inherits 매개 변수에 지정된 기본 클래스를 찾을 수 없는 경우 발생합니다.메시지는 템플릿 지시문의 줄 수를 제공합니다. |
지정한 클래스가 존재하고 여기에 있는 어셈블리가 어셈블리 지시문에 지정되어 있는지 확인해야 합니다. |
파일에 대한 포함 텍스트를 확인하지 못했습니다:{0} |
포함된 템플릿을 찾을 수 없는 경우 발생합니다.메시지는 요청된 포함 파일의 이름을 제공합니다. |
파일 경로가 원래 템플릿 경로에 상대적이거나 파일이 호스트에 등록된 위치에 있거나 파일에 대한 전체 경로가 있는지 확인해야 합니다. |
변환 개체를 초기화하는 동안 오류가 발생했습니다.변환이 실행되지 않습니다. |
변환 클래스의 'Initialize()'가 실패하거나 false를 반환한 경우 발생합니다. |
<#@template#> 지시문 또는 지시문 프로세서에서 지정된 기본 변환 클래스에서 Initialize() 함수의 코드를 가져 옵니다.초기화 실패를 초래한 오류는 오류 목록에 있습니다.실패한 원인을 조사하십시오.템플릿을 디버깅하는 절차를 수행하여 Initialize()의 실제 생성된 코드를 살펴볼 수 있습니다. |
지시문 프로세서 '{1}'의 어셈블리 '{0}'에는 FullTrust 권한 집합이 부여되지 않습니다.신뢰할 수 있는 어셈블리만 지시문 프로세서를 제공할 수 있습니다.이 지시문 프로세서는 로드되지 않습니다. |
시스템이 지시문 프로세서를 포함하는 어셈블리에 FullTrust 권한을 부여하지 않을 경우 발생합니다.메시지는 어셈블리의 이름 및 지시문 프로세서의 이름을 제공합니다. |
로컬 컴퓨터에서 신뢰할 수 있는 어셈블리만 사용해야 합니다. |
경로 '{0}'은(는) 이 컴퓨터에 로컬이거나 신뢰할 수 있는 영역의 일부가 되어야 합니다. |
지시문이나 어셈블리 지시문이 로컬 시스템 또는 네트워크의 신뢰할 수 있는 영역에 없는 파일을 참조할 때 발생합니다. |
지시문 또는 어셈블리 지시문이 위치해 있는 디렉터리가 신뢰할 수 있는 영역에 있는지 확인해야 합니다.Internet Explorer를 통해 신뢰할 수 있는 영역에 네트워크 디렉터리를 추가할 수 있습니다. |
"잘못된 토큰 'catch'" 또는 "네임스페이스는 직접 멤버를 포함할 수 없습니다"와 같은 여러 구문 오류 |
템플릿 코드에 닫는 중괄호가 너무 많습니다.컴파일러는 이를 표준 생성 코드와 혼동합니다. |
코드 구분 기호 내의 닫는 중괄호 및 대괄호 수를 확인하십시오. |
루프 또는 조건부가 올바르게 컴파일 또는 실행되지 않았습니다.예를 들면 다음과 같습니다.
이 코드는 항상 i 값을 출력합니다."Number is:"만 조건부입니다. |
C#에서는 항상 제어문에 포함된 텍스트 블록을 감싸기 위해 중괄호를 사용합니다. |
중괄호 추가:
|
디자인 타임 템플릿을 처리하거나 런타임(전처리) 템플릿을 컴파일할 경우 "식이 너무 복잡합니다.". 런타임 템플릿으로 생성된 코드를 검사하려고 하면 Visual Studio가 작동을 중단합니다. |
텍스트 블록이 너무 깁니다.T4는 각 템플릿 줄에 하나의 문자열 리터럴을 사용하여 텍스트 블록을 문자열 연결 식으로 변환합니다.매우 긴 텍스트 블록으로 컴파일러의 크기 한도가 초과될 수 있습니다. |
다음과 같은 식 블록으로 긴 텍스트 블록을 나눕니다. <#= "" #> |
경고 설명 및 수정
다음 표에서는 사용 가능한 경우 수정 프로그램과 함께 가장 일반적인 경고를 보여 줍니다.
경고 메시지 |
설명 |
해결책 |
---|---|---|
포함 파일 '{0}'을(를) 로드하면 null 또는 빈 문자열이 반환됩니다. |
포함된 텍스트 템플릿이 비어 있는 경우 발생합니다.메시지는 포함된 파일의 파일 이름을 제공합니다. |
포함 지시문 제거하거나 파일의 일부 내용이 있는지 확인해야 합니다. |
변환을 컴파일하는 중: |
변환을 컴파일할 때 발생하는 모든 오류 또는 경고에 이 문자열을 추가합니다.이 문자열은 컴파일러에서 오류 또는 경고가 발생한 것을 의미합니다. |
DLL을 찾는 데 문제가 있을 경우 GAC에 DLL이 있으면 전체 경로 또는 정규화된 강력한 이름을 제공해야 할 수 있습니다. |
매개 변수 '{0}'은(는) 이미 지시문에 있습니다.중복된 매개 변수는 무시됩니다. |
지시문에서 매개 변수를 두 번 이상 지정할 경우 발생합니다.메시지는 매개 변수의 이름 및 지시문의 줄 번호를 제공합니다. |
중복 매개 변수 사양을 제거합니다. |
포함 파일 ' {0}'을(를) 로드하는 동안 오류가 발생했습니다.포함 지시문은 무시됩니다. |
include 지시문에 지정된 파일을 찾을 수 없는 경우 발생합니다.메시지는 파일의 이름 및 지시문의 줄 번호를 제공합니다. |
포함 파일이 원래 텍스트 템플릿과 같은 디렉터리 또는 호스트에 등록된 포함 디렉터리 중 하나에 있는지 확인해야 합니다. |
잘못된 기본 클래스가 Transformation 클래스에 지정되었습니다.기본 클래스는 Microsoft.VisualStudio.TextTemplating.TextTransformation에서 파생되어야 합니다. |
템플릿 지시문에 있는 inherits 매개 변수가 TextTransformation에서 상속되지 않는 클래스를 지정할 때 발생합니다.메시지는 템플릿 지시문의 줄 수를 제공합니다. |
TextTransformation에서 파생되는 클래스를 지정합니다. |
'template' 지시문에 잘못된 문화권이 지정되었습니다.문화권은 "xx-XX" 형식이어야 합니다.고정 문화권이 사용됩니다. |
템플릿 지시문의 culture 매개 변수를 잘못 지정한 경우 발생합니다.메시지는 템플릿 지시문의 줄 수를 제공합니다. |
culture 매개 변수를 "xx-XX" 형식의 유효한 문화권으로 변경합니다. |
템플릿 지시문에 잘못된 디버그 값 '{0}'이(가) 지정되었습니다.디버그 값은 "true" 또는 "false"여야 합니다.기본값인 "false"가 사용됩니다. |
템플릿 지시문의 debug 매개 변수를 잘못 지정한 경우 발생합니다.메시지는 템플릿 지시문의 줄 수를 제공합니다. |
디버그 매개 변수를 "true" 또는 "false"로 설정합니다. |
템플릿 지시문에 잘못된 HostSpecific 값 '{0}'이(가) 지정되었습니다.HostSpecific 값은 "true"또는 "false"여야 합니다.기본값인 "false"가 사용됩니다. |
template 지시문의 호스트 특정 매개 변수를 잘못 지정한 경우 발생합니다.메시지는 템플릿 지시문의 줄 수를 제공합니다. |
호스트 관련 매개 변수를 "true" 또는 "false"로 설정합니다. |
템플릿 지시문에 잘못된 언어 '{0}'이(가) 지정되었습니다.언어는 "C#" 또는 "VB"여야 합니다.기본값인 "C#"이 사용됩니다. |
지원되지 않는 언어가 template 지시문에 지정될 경우 발생합니다."C#" 또는 "VB"(대/소문자 구분 안 함)만 허용됩니다.메시지는 템플릿 지시문의 줄 수를 제공합니다. |
템플릿 지시문의 language 매개 변수를 "C#" 또는 "VB"로 설정합니다. |
여러 출력 지시문이 템플릿에 있습니다.첫 번째 지시문 이외의 모든 지시문이 무시됩니다. |
템플릿 파일에 여러 output 지시문이 지정될 경우 발생합니다.메시지는 중복 출력 지시문의 줄 수를 제공합니다. |
중복 output 지시문을 제거합니다. |
여러 template 지시문이 템플릿에 있습니다.첫 번째 지시문 이외의 모든 지시문이 무시됩니다.template 지시문에 대한 여러 매개 변수가 하나의 template 지시문 내에 지정되어 있어야 합니다. |
텍스트 템플릿 파일(포함된 파일 포함) 내에서 여러 template 지시문을 지정할 경우 발생합니다.메시지는 중복 템플릿 지시문의 줄 수를 제공합니다. |
다른 template 지시문을 한 template 지시문에 집계합니다. |
'{0}'(이)라는 지시문에 대한 프로세서가 지정되지 않았습니다.지시문이 무시됩니다. |
custom 지시문을 지정하지만 processor 특성을 제공하지 않을 경우 발생합니다.메시지는 지시문의 이름 및 줄 번호를 제공합니다. |
지시문에 대한 directive 프로세서의 이름이 있는 processor 특성을 제공합니다. |
이름이 '{0}'인 프로세서가 이름이 '{1}'인 지시문을 찾을 수 없습니다.지시문이 무시됩니다. |
시스템이 custom 지시문 내에 지정한 directive 프로세서를 찾을 수 없는 경우 발생합니다.메시지는 지시문 이름, 프로세서 이름 및 지시문의 줄 번호를 제공합니다. |
지시문에서 processor 특성을 지시문 프로세서의 이름으로 설정합니다. |
지시문에 '{1}'에 대한 필수 매개 변수 '{0}'을(를) 찾을 수 없습니다.지시문이 무시됩니다. |
시스템이 필요한 지시문 매개 변수를 제공하지 않을 경우 발생합니다.메시지는 누락된 매개 변수의 이름, 지시문 이름 및 줄 번호를 제공합니다. |
누락된 매개 변수를 제공합니다. |
이름이 '{0}'인 프로세서는 이름이 '{1}'인 지시문을 지원하지 않습니다.지시문이 무시됩니다. |
지시문 프로세서가 지시문을 지원하지 않을 경우 발생합니다.메시지는 지시문 프로세서 이름과 함께 잘못된 지시문의 이름과 줄 번호를 제공합니다. |
지시문의 이름을 수정합니다. |
파일 '{0}'에 대한 포함 지시문에서는 무한 루프가 발생합니다. |
순환 포함 지시문이 지정된 경우 표시됩니다(예를 들어, 파일 A가 파일 A를 포함하는 파일 B를 포함). |
순환 포함 지시문을 지정하지 마십시오. |
실행 중인 변환: |
변환을 실행하는 동안 생성되는 모든 오류 또는 경고에 이 문자열을 추가합니다. |
해당 사항 없음. |
예기치 않은 시작 또는 끝 태그가 블록에 있습니다.시작 또는 끝 태그를 잘못 입력하지 않았고 템플릿에 중첩된 블록이 없는지 확인하십시오. |
예기치 않은 <# 또는 #>가 있을 때 표시됩니다.즉, 닫히지 않은 다른 열린 태그 앞에 <# 표시가 있거나 열린 태그가 없는데도 #> 표시가 있는 경우가 이에 해당합니다.메시지는 일치하지 않는 태그의 줄 수를 제공합니다. |
일치하지 않는 시작 또는 끝 태그를 제거하거나 이스케이프 문자를 사용하십시오. |
지시문이 잘못된 형식으로 지정되었습니다.지시문이 무시됩니다.지시문을 <#@ name [parametername="parametervalue"]* #> 형식으로 지정하십시오. |
지시문이 올바른 형식으로 지정되지 않은 경우 파서에 의해 표시됩니다.메시지는 잘못된 지시문의 줄 수를 제공합니다. |
모든 지시문의 양식은 <#@ name [parametername="parametervalue"]* #>이어야 합니다.자세한 내용은 T4 텍스트 템플릿 지시문을 참조하십시오. |
등록된 지시문 프로세서 '{1}'에 어셈블리 '{0}'을(를) 로드할 수 없습니다. {2} |
호스트가 지시문 프로세서를 로드할 수 없는 경우 발생합니다.메시지는 지시문 프로세서 및 지시문 프로세서 이름을 제공하는 어셈블리를 식별합니다. |
지시문 프로세서가 올바르게 등록되어 있고 어셈블리가 있는지 확인해야 합니다. |
등록된 지시문 프로세서 '{2}'에 대해 어셈블리 '{1}'에서 '{0}' 형식을 찾을 수 없습니다. {3} |
지시문 프로세서 형식을 어셈블리에서 로드할 수 없을 경우 발생합니다.메시지는 형식, 어셈블리 및 지시문 프로세서의 이름을 제공합니다. |
vshost는 레지스트리에서 지시문 프로세서 정보(이름, 어셈블리 및 형식)를 찾습니다.지시문 프로세서가 올바르게 등록되어 있고 어셈블리에 형식이 있는지 확인해야 합니다. |
어셈블리 '{0}'을(를) 로드하는 동안 문제가 발생했습니다. |
어셈블리를 로드하는 데 문제가 있을 경우 발생합니다.메시지는 어셈블리의 이름을 제공합니다. |
<@#assembly#> 지시문 및 지시문 프로세서에서 로드할 어셈블리를 지정할 수 있습니다.이 문자열 뒤에 나오는 오류 메시지는 어셈블리 로드에 실패한 이유에 대한 더 많은 데이터를 제공해야 합니다. |
'{1}'(이)라는 지시문에 대한 프로세서를 만들고 초기화하는 동안 문제가 발생했습니다.프로세서의 형식은 {0}입니다.지시문이 무시됩니다. |
시스템이 지시문 프로세서를 만들거나 초기화할 수 없는 경우 발생합니다.메시지는 지시문 이름과 줄 번호 및 프로세서 형식을 제공합니다. |
올바른 지시문 프로세서를 사용하고 지시문 프로세서에 공용 기본 생성자가 있어야 합니다.그렇지 않으면, 디버그 옵션을 사용하여 지시문 프로세서의 Initialize() 메서드가 실패하는 이유를 찾습니다.자세한 내용은 T4 텍스트 템플릿 디버깅을 참조하십시오. |
'{0}'(이)라는 지시문을 처리하는 동안 예외가 throw되었습니다. |
지시문 프로세서가 지시문을 처리하는 동안 예외를 throw할 경우 발생합니다. |
지시문 프로세서에 대한 매개 변수가 올바른지 확인합니다. |
어셈블리 참조 '{0}'을(를) 확인하는 동안 호스트에 예외가 발생했습니다. |
어셈블리 참조를 확인하려고 하면 호스트가 예외를 throw하는 경우 발생합니다.어셈블리는 어셈블리 참조 문자열을 제공합니다. |
어셈블리 참조는 <@#assembly#> 지시문 및 지시문 처리기에서 수집됩니다.어셈블리 매개 변수에 제공된 'name' 매개 변수가 올바른지 확인합니다. |
지시문 {2} 에 대한 지원되지 않는 {1} 값 '{0}'을(를) 지정하려고 시도합니다. |
지원되지 않는 요구를 제공하거나 인수를 제공할 때 RequiresProvidesDirectiveProcessor(여기에서 파생된 모든 생성된 지시문 프로세서)에 의해 발생합니다. |
name='value' 쌍에 있는 이름이 필요하며 제공되는 매개 변수가 올바른지 확인해야 합니다. |