Поделиться через


Отладка текстового шаблона T4

Точки останова можно задать в текстовых шаблонах. Чтобы выполнить отладку текстового шаблона во время разработки, сохраните текстовый файл шаблона и выберите "Отладка шаблона T4" в контекстном меню файла в Обозреватель решений. Чтобы выполнить отладку текстового шаблона во время выполнения, просто отладите приложение, к которому он принадлежит.

Чтобы выполнить отладку текстового шаблона, необходимо понять шаги процесса преобразования шаблона. На каждом шаге могут возникать различные виды ошибок. Ниже приведены шаги.

Этап Шаблон времени разработки: когда это происходит Шаблон времени выполнения: когда это происходит
Код создается из текстового шаблона.

Ошибки в директивах или несоответствие <#...#> или нарушение тегов.
При сохранении шаблона или вызове преобразования текста. При сохранении шаблона или вызове преобразования текста.
Созданный код компилируется.

Ошибки компиляции в коде шаблона.
Сразу после предыдущего шага. Вместе с кодом приложения.
Выполняется код.

Ошибки во время выполнения в коде шаблона.
Сразу после предыдущего шага. При запуске приложения и вызове кода шаблона.

В большинстве случаев номера строк в коде шаблона задаются в отчете об ошибке. Если отчет об ошибке ссылается на временное имя файла, обычно это несогласованная скобка в коде текстового шаблона.

Точки останова можно задать в текстовых шаблонах и отладить обычным образом.

Распространенные ошибки и исправления

В следующей таблице перечислены наиболее распространенные ошибки и их исправления.

Сообщение об ошибке Описание Решение
Не удалось загрузить базовый класс "{0}" из которого наследует класс преобразования. Происходит, если базовый класс, указанный в параметре inherits , не указан в директиве шаблона. Сообщение предоставляет номер строки директивы шаблона. Убедитесь, что указанный класс существует, и что сборка, в которую она существует, указана в директиве сборки.
Не удалось разрешить включение текста для файла:{0} Происходит, когда не удается найти включенный шаблон. В сообщении указано имя запрошенного файла включения. Убедитесь, что путь к файлу относительно исходного пути шаблона или файл находится в расположении, зарегистрированном в узле, или что имеется полный путь к файлу.
Ошибки были созданы при инициализации объекта преобразования. Преобразование не будет выполняться. Происходит, когда метод Initialize()класса преобразования завершился ошибкой или возвращает значение false. Код функции Initialize() поступает из базового класса преобразования, указанного в <директиве #@template#> и от процессоров директив. Ошибка, которая вызвала сбой инициализации, вероятно, находится в списке ошибок. Изучите причину сбоя. Вы можете просмотреть фактически созданный код для Initialize(), выполнив процедуры отладки шаблона.
Сборка "{0}" для обработчика директив "{1}" не была предоставлена набор разрешений FullTrust. Только доверенные сборки могут предоставлять процессоры директив. Этот обработчик директив не будет загружен. Происходит, когда система не предоставляет разрешения FullTrust сборке, содержащей обработчик директив. Сообщение содержит имя сборки и имя обработчика директив. Убедитесь, что на локальном компьютере используются только доверенные сборки.
Путь "{0}" должен быть локальным для этого компьютера или частью доверенной зоны. Происходит, когда директива или директива сборки ссылается на файл, который не находится на локальном компьютере или в доверенной зоне сети. Убедитесь, что каталог, в котором находятся директивы или директивы сборки, находится в доверенной зоне. Вы можете добавить сетевой каталог в надежную зону через Интернет Обозреватель.
Несколько синтаксической ошибок, таких как "Недопустимый маркер catch" или "Пространство имен не может напрямую содержать элементы". Слишком много закрывающих фигурных скобок в коде шаблона. Компилятор запутает его с кодом стандартного поколения. Проверьте количество закрывающих фигурных скобок и квадратных скобок внутри разделителей кода.
Циклы или условные условия не компилируются или не выполняются правильно. Например: <#if (i>10)#> Number is: <#= i #>.

Этот код всегда выводит значение i. Только "Число равно:" является условным.
В C#всегда используйте фигурные скобки для окружности текстовых блоков, внедренных в операторы управления. Добавьте фигурные скобки: <#if (i>10) { #> Number is: <#= i #><# } #>.
Выражение слишком сложное при обработке шаблона времени разработки или компиляции шаблона среды выполнения (предварительно обработанного).

Visual Studio перестает работать при попытке проверить код, созданный шаблоном среды выполнения.
Блок текста слишком длинный. T4 преобразует текстовые блоки в выражение объединения строк с одной строкой для каждой строки шаблона. Очень длинные текстовые блоки могут преодолеть ограничения размера компилятора. Разбиите длинный текстовый блок с блоком выражений, например:

<#= "" #>

Описания предупреждений и исправления

В следующей таблице перечислены наиболее распространенные предупреждения вместе с исправлениями, если они доступны.

Предупреждающее сообщение Описание Решение
Загрузка файла include '{0}' возвращает пустую или пустую строку. Происходит, если включенный текстовый файл шаблона пуст. Сообщение предоставляет имя файла включенного файла. Удалите директиву include или убедитесь, что файл содержит некоторое содержимое.
Преобразование компиляции: Добавляет эту строку ко всем ошибкам или предупреждениям, исходящим от компилятора при компиляции преобразования. Эта строка означает, что компилятор вызвал ошибку или предупреждение. Если у вас возникла проблема с поиском библиотеки DLL, возможно, потребуется указать полный путь или полное строгое имя, если библиотека DLL находится в GAC.
Параметр '{0}' уже существует в директиве. Повторяющийся параметр будет игнорироваться. Происходит при указании параметра более одного раза в директиве. Сообщение содержит имя параметра и номер строки директивы. Удалите спецификацию повторяющихся параметров.
Произошла ошибка при загрузке файла включаемого файла .{0} Директива include будет игнорироваться. Происходит, если файл, указанный в директиве include , не удается найти. Сообщение содержит имя файла и номер строки директивы. Убедитесь, что файл включения существует либо в том же каталоге, что и исходный текстовый файл шаблона, либо в одном из каталогов включения, зарегистрированных в узле.
Недопустимый базовый класс был указан для класса Преобразования. Базовый класс должен быть производным от Microsoft.VisualStudio.TextTemplating.TextTransformation. Происходит, когда inherits параметр в директиве шаблона указывает класс, от который не наследуется TextTransformation. Сообщение предоставляет номер строки директивы шаблона. Укажите класс, производный от TextTransformation.
Недопустимый язык и региональные параметры был указан в директиве template. Язык и региональные параметры должны находиться в формате XX-XX. Будет использоваться инвариантный язык и региональные параметры. Происходит, когда параметр языка и региональных параметров в директиве шаблона указан неправильно. Сообщение предоставляет номер строки директивы шаблона. Измените параметр языка и региональных параметров на допустимый язык и региональные параметры в формате xx-XX.
Недопустимое значение отладки было{0} указано в директиве шаблона. Значение отладки должно иметь значение true или false. Будет использоваться значение по умолчанию false. Происходит при debug неправильном указании параметра в директиве шаблона. Сообщение предоставляет номер строки директивы шаблона. Задайте для параметра отладки значение true или false.
Недопустимое значение{0} HostSpecific было указано в директиве шаблона. Значение HostSpecific должно иметь значение true или false. Будет использоваться значение по умолчанию false. Происходит, когда параметр для конкретного узла в директиве template указан неправильно. Сообщение предоставляет номер строки директивы шаблона. Задайте для параметра, зависящем от узла, значение true или false.
Недопустимый язык "{0}" был указан в директиве "template". Язык должен быть "C#" или "VB". Будет использоваться значение по умолчанию "C#". Происходит, когда неподдерживаемый язык указан в директиве template . Разрешены только "C#" или "VB" (не учитывается регистр). Сообщение предоставляет номер строки директивы шаблона. language Задайте параметр в директиве шаблона значение "C#" или "VB".
В шаблоне найдено несколько директив выходных данных. Все, кроме первого, будут игнорироваться. Происходит при указании нескольких output директив в файле шаблона. Сообщение предоставляет номер строки повторяющегося выходного директивы. Удалите повторяющиеся output директивы.
В шаблоне найдено несколько директив шаблона. Все, кроме первого, будут игнорироваться. В одной директиве шаблона необходимо указать несколько параметров директивы шаблона. Происходит при указании нескольких template директив в текстовом файле шаблона (включая включенные файлы). Сообщение предоставляет номер строки повторяющегося директивы шаблона. Объединяйте разные template директивы в одну template директиву.
Для директивы с именем '{0}' не указан обработчик. Директива будет игнорироваться. Происходит, если указать директиву custom , но не указать processor атрибут. Сообщение содержит имя директивы и номер строки. processor Укажите атрибут с именем directive процессора для директивы.
Не удалось найти обработчик с именем '{0}' для директивы с именем '{1}'. Директива будет игнорироваться. Происходит, когда система не может найти процессор, указанный directive в директиве custom . Сообщение содержит имя директивы, имя процессора и номер строки директивы. processor Задайте атрибут в директиве именем обработчика директив.
Обязательный параметр '{0}' для директивы '{1}' не найден. Директива будет игнорироваться. Происходит, когда система не предоставляет обязательный параметр директивы. Сообщение содержит имя отсутствующих параметров, имя директивы и номер строки. Укажите отсутствующий параметр.
Обработчик с именем '{0}' не поддерживает директиву с именем '{1}'. Директива будет игнорироваться. Происходит, когда обработчик директив не поддерживает директиву. Сообщение предоставляет имя и номер строки директивы, а также имя обработчика директив. Исправьте имя директивы.
Директива include для файла '{0}' вызывает бесконечный цикл. Отображается, если указаны директивы циклического включения (например, файл A включает файл B, который включает файл A). Не указывайте директивы циклического включения.
Выполнение преобразования: Добавляет эту строку ко всем ошибкам или предупреждениям, созданным при выполнении преобразования. Неприменимо.
Непредвиденный тег начала или конца был найден в блоке. Убедитесь, что вы не ввели неправильный тег начального или конечного тега, и что в шаблоне нет вложенных блоков. Отображается при непредвиденном <# или #>. То есть, если у вас есть <# после другого открытого тега, который не был закрыт, или у вас есть #> , если перед ним нет незакрытого открытого тега. Сообщение предоставляет номер строки несовпадения тега. Удалите несогласованный тег начала или конца или используйте escape-символ.
Директива была указана в неправильном формате. Директива будет игнорироваться. Укажите директиву в формате <#@ name [parametername="parametervalue"]* #> Отображается средство синтаксического анализа, если директива не указана в правильном формате. Сообщение предоставляет номер строки неправильной директивы. Убедитесь, что все директивы находятся в форме <#@ name [parametername="parametervalue"]* #>. Дополнительные сведения см. в директивах шаблона текста T4.
Не удалось загрузить сборку "{0}" для зарегистрированного обработчика директив "{1}"

{2}
Происходит, когда обработчик директив не может быть загружен узлом. Сообщение определяет сборку, указанную для обработчика директив, и имя обработчика директив. Убедитесь, что обработчик директив зарегистрирован правильно и что сборка существует.
Не удалось найти тип '{0}' в сборке '{1}' для зарегистрированного обработчика директив '{2}'

{3}
Происходит, когда не удалось загрузить тип обработчика директив из сборки. В сообщении указано имя типа, сборки и обработчика директив. Vshost находит сведения о обработчике директив (имя, сборка и тип) в реестре. Убедитесь, что обработчик директив зарегистрирован правильно, и что тип существует в сборке.
Возникла проблема с загрузкой сборки '{0}' Возникает, когда возникает проблема с загрузкой сборки. Сообщение содержит имя сборки. Сборки можно загружать в <директивы @#assembly#> и процессорами директив. Сообщение об ошибке, следующее за этой строкой, должно предоставить дополнительные данные о том, почему сбой загрузки сборки.
Возникла проблема при создании и инициализации процессора для директивы с именем '{1}'. Тип процессора .{0} Директива будет игнорироваться. Происходит, когда система не могла создать или инициализировать обработчик директив. Сообщение содержит имя и номер строки директивы и тип процессора. Убедитесь, что используется правильный процессор директив и что обработчик директив имеет общедоступный конструктор по умолчанию. В противном случае используйте параметры отладки, чтобы узнать, почему метод Initialize() обработчика директив завершается сбоем. Дополнительные сведения см. в разделе "Устранение неполадок с текстовыми шаблонами".
Исключение было создано при обработке директивы с именем '{0}'. Происходит, когда обработчик директив создает исключение при обработке директивы. Убедитесь, что параметры обработчика директив верны.
Узел вызвал исключение при попытке разрешить ссылку на сборку "{0}". Возникает, когда узел создает исключение при попытке устранить ссылку на сборку. Сообщение предоставляет строку ссылки на сборку. Ссылки на сборки приходят из директив @#assembly#> и из <процессоров директив. Убедитесь, что параметр name, указанный в параметре сборки, является правильным.
Попытка указать неподдерживаемое {1} значение '{0}' для директивы {2} Происходит с помощью RequiresProvidesDirectiveProcessor (все созданные процессоры директив наследуются от него), когда вы предоставляете неподдерживаемый аргумент или предоставляет аргумент. Убедитесь, что имена пар name='value', указанные в необходимых параметрах, и предоставляет правильные параметры.