연습: 텍스트 템플릿 디버깅
텍스트 템플릿을 디버깅하려면 템플릿 변환 프로세스의 두 가지 단계를 이해해야 합니다. 각 단계에서 다양한 클래스의 오류가 발생할 수 있습니다. 두 단계는 다음과 같습니다.
텍스트 템플릿 변환 엔진이 생성된 변환 클래스라는 클래스를 만듭니다. 생성된 변환 클래스를 만들기 위해 텍스트 템플릿 변환 엔진은 텍스트 템플릿의 구문을 분석할 수 있어야 합니다.
이 단계에서 잘못된 태그와 같은 텍스트 템플릿의 오류로 인해 텍스트 템플릿의 구문이 분석되지 못할 수도 있습니다. 오류는 올바른 텍스트 템플릿 줄 번호와 함께 보고됩니다.
변환 엔진이 생성된 변환 클래스를 컴파일합니다.
이 단계에서 코드 오류로 인해 생성된 변환 클래스가 컴파일되지 못할 수도 있습니다. 대부분의 오류는 올바른 텍스트 템플릿 줄 번호와 함께 보고됩니다. 템플릿 코드의 대괄호가 일치하지 않기 때문에 임시 파일 이름이 있는 변환된 클래스를 참조하는 오류가 발생할 수 있습니다.
컴파일된 변환 클래스가 실행되어 출력을 생성합니다.
이 단계의 오류는 올바른 줄 번호와 함께 보고되지 않습니다. 템플릿 코드를 단계별로 실행할 수 있지만 다음 단원에 설명된 대로 디버거를 명시적으로 시작해야 합니다.
텍스트 템플릿을 디버깅하려면 먼저 텍스트 템플릿의 오류를 해결해야 합니다. 그런 다음 생성된 변환 클래스의 오류를 해결해야 합니다.
참고
텍스트 템플릿을 변환할 때 텍스트 템플릿, 생성된 변환 클래스, 텍스트 템플릿 내에서 호출하는 지시문 중 하나에서 오류가 발생할 수 있습니다. 이 연습에서는 텍스트 템플릿과 생성된 변환 클래스의 오류를 디버깅합니다. 그러나 이러한 절차를 사용하여 사용자 지정 지시문을 디버깅할 수도 있습니다.
이 연습에서 수행할 작업은 다음과 같습니다.
잘못된 텍스트 템플릿 태그 디버깅
템플릿 코드 단계별 실행
텍스트 템플릿 만들기
C# 콘솔 응용 프로그램 프로젝트를 만들고 텍스트 템플릿을 솔루션에 추가합니다. 이후 단계에서 이 텍스트 템플릿을 디버깅합니다.
텍스트 템플릿을 만들려면
Visual Studio에서 새 C# 콘솔 응용 프로그램을 만들고 이름을 DebugTemplate으로 지정합니다.
DebugTest.tt라는 텍스트 템플릿 파일을 DebugTemplate 프로젝트에 추가합니다.
DebugTest.tt의 사용자 지정 도구 속성이 TextTemplatingFileGenerator로 설정되어 있는지 확인합니다.
다음 코드만 포함하도록 파일을 편집합니다.
<#@ output extension=".txt" #>
파일을 저장합니다.
텍스트 템플릿이 변환되고 해당하는 출력 파일이 생성됩니다. 새 파일이 솔루션 탐색기에서 텍스트 템플릿 파일 아래에 나타납니다.
잘못된 텍스트 템플릿 태그 디버깅
텍스트 템플릿을 작성할 때의 일반적인 구문 오류는 잘못된 시작 태그나 끝 태그를 사용하는 것입니다. 이 절차에서는 잘못된 태그를 디버깅합니다.
잘못된 텍스트 템플릿 태그를 디버깅하려면
DebugTest.tt에 다음 코드를 추가합니다.
참고
코드에 오류가 있습니다. 디버깅하기 위해 의도적으로 오류를 삽입하려고 합니다.
<# for (int i = 0; i < 3; i++) { > Hello, World! <# } #>
파일을 저장합니다.
오류 목록 창이 나타나고 다음 오류가 표시됩니다.
블록 내에서 예기치 않은 시작 또는 끝 태그가 발견되었습니다. 시작 또는 끝 태그를 잘못 입력하지 않았고 템플릿에 중첩된 블록이 없는지 확인하십시오.
이 경우 코드의 오류는 잘못된 끝 태그입니다. 끝 태그의 #이 없습니다.
오류 목록 창의 오류를 두 번 클릭하여 코드로 이동합니다.
코드를 수정하기 위해 #을 끝 태그에 추가합니다.
<# for (int i = 0; i < 3; i++) { #>
파일을 저장합니다.
이제 텍스트 템플릿이 변환되고 해당하는 출력 파일이 생성됩니다. 오류 목록 창에 오류가 없습니다.
템플릿 코드 단계별 실행
템플릿 코드를 단계별로 실행하려면 두 항목을 템플릿에 추가해야 합니다.
<@#template debug="true" #>
System.Diagnostics.Debugger.Launch();
다음 절차에서는 존재하지 않는 요소 인덱스를 디버깅합니다. 이 오류는 이전 절차의 오류와 유사합니다. 그러나 이번에는 Visual Studio 디버거를 사용하여 오류를 디버깅합니다.
디버거를 사용하여 디버깅하려면
C:\nonsense 폴더를 만든 다음 nonsense.xml이라는 빈 텍스트 파일을 이 폴더에 저장합니다.
DebugTest.tt의 코드를 다음 코드로 바꿉니다.
참고
코드에 오류가 있습니다. 디버깅하기 위해 의도적으로 오류를 삽입하려고 합니다.
<#@ output extension=".txt" #> <#@ assembly name="System.Xml.dll" #> <#@ import namespace="System.Xml" #> <# XmlDocument xDoc = new XmlDocument(); xDoc.Load(@"C:\nonsense\nonsense.xml"); XmlAttributeCollection attributes = xDoc.Attributes; if (attributes != null) { foreach (XmlAttribute attr in attributes) { #> <#= attr.Name #> <# } } #>
파일을 저장합니다.
오류 목록 창이 나타나고 다음 오류가 표시됩니다.
변환을 실행하는 중: System.Xml.XmlException: 루트 요소가 없습니다.
debug 매개 변수를 true로 설정하여 template 지시문을 추가합니다.
<#@ template debug="true" #>
System.Diagnostics.Debugger.Launch() 문을 텍스트 템플릿 코드에 추가합니다.
코드는 다음과 같습니다.
<#@ template debug="true" #> <#@ output extension=".txt" #> <#@ assembly name="System.Xml.dll" #> <#@ import namespace="System.Xml" #> <# XmlDocument xDoc = new XmlDocument(); System.Diagnostics.Debugger.Launch(); xDoc.Load(@"C:\nonsense\nonsense.xml"); XmlAttributeCollection attributes = xDoc.Attributes; if (attributes != null) { foreach (XmlAttribute attr in attributes) { #> <#= attr.Name #> <# } } #>
변환을 다시 실행합니다.
Visual Studio Just-In-Time Debugger 대화 상자가 나타납니다.
사용 가능한 디버거 목록에서 새 인스턴스 Visual Studio 2010을 클릭하고 예를 클릭합니다.
DebugTest.tt가 Visual Studio의 새 인스턴스에서 열립니다.
다음 줄까지 코드를 단계별로 실행합니다.
xDoc.Load(@"C:\nonsense\nonsense.xml");
오류가 이 줄에서 발생합니다.
두 번째 Visual Studio 인스턴스를 닫습니다.
디버그 메뉴에서 디버깅 중지를 클릭합니다.
파일 메뉴에서 끝내기를 클릭합니다.
변경 내용을 솔루션에 저장할지 확인하는 메시지가 나타나면 아니요를 클릭합니다.
두 번째 Visual Studio 인스턴스가 닫힙니다.
텍스트 템플릿을 수정하고 디버깅 기능을 제거합니다.
솔루션 탐색기에서 DebugTest.tt를 두 번 클릭하여 편집기에서 엽니다.
잘못된 파일 이름을 수정합니다. 예를 들어, 다음과 같이 바꿉니다.
@"C:\\Program Files\\Microsoft Visual Studio 10.0\\Xml\\SnippetsIndex.xml"
template 지시문과 오류가 발생한 줄을 제거합니다.
텍스트 템플릿은 다음과 같습니다.
<#@ output extension=".txt" #> <#@ assembly name="System.Xml.dll" #> <#@ import namespace="System.Xml" #> <# XmlDocument xDoc = new XmlDocument(); xDoc.Load(@"C:\Program Files\Microsoft Visual Studio 10.0\Xml\SnippetsIndex.xml"); foreach (XmlNode node in xDoc.SelectNodes("//*")) { #> <#= node.Name #> <# } #>
DebugTest.tt를 저장합니다. 오류가 없고 생성되는 .txt 파일에 XML 파일의 노드 이름 목록이 있는지 확인합니다.