Пошаговое руководство. Отладка текстового шаблона
Для отладки текстового шаблона необходимо понимать суть двух шагов процесса преобразования шаблона. Классы ошибок, которые могут происходить на этих шагах, различаются. Вот что это за шаги.
Процессор преобразования текстового шаблона создает класс, называемый сгенерированным классом преобразования. Для создания сгенерированного класса преобразования процессор преобразования текстового шаблона должен быть способен произвести синтаксический анализ этого шаблона.
На данном шаге синтаксическому анализу могут воспрепятствовать такие ошибки в текстовом шаблоне, как неверные теги. Сообщения об ошибках содержат правильный номер строки текстового шаблона.
Процессор шаблонов компилирует сгенерированный класс преобразования.
На этом шаге ошибки кода могут воспрепятствовать компиляции сгенерированного класса преобразования. Сообщения об ошибках в большинстве своем содержат правильный номер строки текстового шаблона. Несоответствие скобок в коде шаблона может привести к ошибкам, содержащим ссылки на преобразованный класс с временным именем файла.
Скомпилированный класс преобразования выполняется для генерирования вывода.
Сообщения об ошибках, выдаваемые на этом этапе, не содержат правильного номера строки. Можно выполнить код шаблона в пошаговом режиме, однако необходимо явно загрузить отладчик, как описано в следующем разделе.
Для отладки текстового шаблона вначале необходимо исправить содержащиеся в нем ошибки. Затем нужно исправить ошибки в сгенерированном классе преобразования.
Примечание
Во время преобразования текстового шаблона можно получать сообщения об ошибках из трех источников: текстовый шаблон, сгенерированный класс преобразования и директивы, которые вызываются из текстового шаблона.В этом пошаговом руководстве вы отладите ошибки в текстовом шаблоне и сгенерированном классе преобразования.Однако описанные в нем процедуры подходят и для отладки пользовательских директив.
В данном пошаговом руководстве представлены следующие задачи:
Отладка неверного тега текстового шаблона
Пошаговое выполнение кода шаблона
Создание текстового шаблона
Создайте проект консольного приложения C# и добавьте в решение текстовый шаблон. Этот шаблон вы будете впоследствии отлаживать.
Создание текстового шаблона
Создайте в Visual Studio новое консольное приложение C# и назовите его DebugTemplate.
Добавьте в проект DebugTemplate файл текстового шаблона с именем DebugTest.tt.
Убедитесь, что свойство Специальный инструмент файла 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: отсутствует корневой элемент.
Добавьте директиву template с параметром debug, равным true:
<#@ 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 #> <# } } #>
Снова запустите преобразование.
Появится диалоговое окно JIT-отладчик Visual Studio.
В списке Доступные отладчики выберите Новый экземпляр 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-файле.
См. также
Ссылки
Распространенные ошибки и предупреждения при использовании текстовых шаблонов