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

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

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

Шаг

Шаблон времени разработки: происходит, когда он

Шаблон времени выполнения: происходит, когда он

Код создается из текстового шаблона.

Ошибки в директивах или рассогласованных или disordered тегах <#…#>.

При сохранении шаблона или вызвать преобразование текста.

При сохранении шаблона или вызвать преобразование текста.

Созданный код компилироваться.

Ошибки компиляции в коде шаблона.

Сразу после предыдущего шага.

Вместе с кодом приложения.

Закодируйте запуска.

Ошибки во время выполнения в коде шаблона.

Сразу после предыдущего шага.

Когда приложение запускается и вызывающий код шаблона.

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

Можно установить точки останова в текстовых шаблонах и отладку обычным способом.

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

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

Сообщение об ошибке

Описание

Решение

Не удалось загрузить базовый класс "{0}", от которого наследует класс преобразования.

Возникает, если не удается найти базовый класс, указанный в параметре inherits в директиве "шаблон".В сообщении указывается номер строки директивы шаблона.

Убедитесь, что указанный класс существует и сборка, в которой он находится, указана в директиве сборок.

Не удалось разрешить текст включения для файла:{0}

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

Убедитесь, что путь к файлу задается относительно исходного пути шаблона, или что файл находится в расположении, зарегистрированном с узлом, или что это полный путь к файлу.

При инициализации объекта преобразования возникли ошибки.Преобразование не будет выполнено.

Возникает, когда "Initialize()" класса преобразования завершается со сбоем или возвращает значение "false".

Код в функцию Initialize() поступает из базового класса преобразования, указанного в директиве <#@template#> и из процессоров директив.Ошибка, вызвавшая неудачное завершение инициализации, вероятно находится в списке ошибок.Исследуйте причину сбоя.Можно посмотреть на фактическое созданный код метода Initialize(), выполнив следующие процедуры для отладки шаблона.

Сборке "{0}"для процессора директив "{1}" не был предоставлен набор разрешений FullTrust.Только доверенным сборкам разрешается поставлять директивы процесса.Этот процессор директив не будет загружен.

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

Убедитесь, что на локальном компьютере используются только надежные сборки.

Путь "{0}" должен быть локальным для этого компьютера или частью доверенной зоны.

Возникает, когда директива или директива сборки ссылается на файл, находящийся не на локальном компьютере и не в надежной зоне сети.

Убедитесь в том, что каталог, в котором расположена директива, или директивы сборки расположены в надежной зоне.Можно добавить сетевой каталог в доверенную зону с помощью Internet Explorer.

Несколько синтаксических ошибок, таких как «Недопустимый токен "catch"» или "Пространство имен не может непосредственно содержать элементы"

Слишком много закрывающих скобок в коде шаблона.Компилятор путает его со стандартным кодом создания.

Проверьте число закрывающих скобок и квадратные скобки внутри разделителей кода.

Циклы или условные выражения не компилируется или не выполняется правильно.Например:

<#if (i>10)#>
   Number is: <#= i #>.

Этот код всегда выводит значение i.Только "номер:" является условным.

В C# всегда используйте скобки вокруг текстовых блоков, внедренных в операторы управления.

Добавьте фигурные скобки:

<#if (i>10) { #>
   Number is: <#= i #>.
<# } #>

«Слишком сложное выражение» при обработке шаблона во время разработки или компиляции шаблона (предварительно обработанного) во время выполнения.

Visual Studio перестает работать при попытке проверить код, созданные шаблоном среды выполнения.

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

Разбить длинный блок текста блоком выражения, например:

<#= "" #>

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

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

Сообщение предупреждения

Описание

Решение

Загрузка файла включения '{0}' возвратила значение NULL или пустую строку.

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

Удалите директивы включения или убедитесь, что файл имеет некоторое содержимое.

Компиляция преобразования:

Добавляет данную строку в начало всех ошибок или предупреждений, приходящих от компилятора при компиляции преобразования.Эта строка означает, что компилятор выдал ошибку или предупреждение.

Если возникают неполадки при поиске библиотеки DLL, может потребоваться предоставить либо полный путь, либо полное строгое имя, если эта библиотека DLL находится в глобальном кэше сборок.

Параметр "{0}" уже есть в директиве.Дублирующий параметр будет игнорироваться.

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

Удалите повторяющуюся спецификацию параметра.

Ошибка загрузки включаемого файла "{0}".Директива включения будет игнорироваться.

Возникает, когда не удается найти файл, указанный в директиве include.Сообщение предоставляет имя файла и номер строки директивы.

Убедитесь, что включаемый файл существует либо в том же каталоге, что исходный файл текстового шаблона, либо в одном из каталогов включения, зарегистрированных с узлом.

Указан недопустимый базовый класс для класса Transformation.Базовый класс должен быть производным от Microsoft.VisualStudio.TextTemplating.TextTransformation.

Возникает, когда параметр inherits в директиве шаблона указывает класс, который не наследует от TextTransformation.В сообщении указывается номер строки директивы шаблона.

Укажите класс, производный от класса TextTransformation.

В директиве "template" указана недопустимая культура.Культура должна иметь формат "xx-XX" format.Будет использоваться инвариантная культура.

Возникает, когда параметр языка и региональных параметров в директиве шаблона указан неправильно.В сообщении указывается номер строки директивы шаблона.

Измените параметр языка и региональных параметров на допустимый язык и региональные параметры в формате "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.

Не указан процессор для директивы с именем "{0}".Директива будет проигнорирована.

Возникает, если указана директива custom, но не предоставлен атрибут processor.Сообщение предоставляет имя директивы и номер строки.

Предоставьте атрибут processor с именем процессора directive для этой директивы.

Не удалось найти процессор с именем "{0}" для директивы с именем "{1}".Директива будет проигнорирована.

Возникает, когда системе не удается найти процессор directive, указанный в директиве custom.Сообщение предоставляет имя директивы, имя процессора и номер строки директивы.

Задайте значение атрибута processor в директиве, равное имени процессора директив.

Обязательный параметр "{0}"для директивы "{1}" не обнаружен.Директива будет проигнорирована.

Возникает, когда система не предоставляет обязательный параметр директивы.Сообщение предоставляет имя пропущенного параметра, имя директивы и номер строки.

Добавьте недостающий параметр.

Процессор с именем "{0}" не поддерживает директиву с именем "{1}".Директива будет проигнорирована.

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

Исправьте имя директивы.

Директива включения для файла "{0}" привела к бесконечному циклу.

Отображается, если указаны циклические директивы включения (например, файл А включает файл Б, который включает файл А).

Не следует указывать циклические директивы включения.

Запуск преобразования:

Добавляет данную строку в начало всех ошибок или предупреждений, которые создаются при выполнении преобразования.

Неприменимо.

В блоке обнаружен непредвиденный открывающий или закрывающий тег.Убедитесь, что не был пропущен начальный или конечный тег и что в шаблоне отсутствуют вложенные блоки.

Отображается при наличии непредвиденного оператора <# или #>.То есть в случае наличия "<#" после другого открытого тега, который не был закрыт, или "#>", если перед этим нет незакрытого открытого тега.Сообщение предоставляет номер строки пропущенного тега.

Удалите несоответствующий тег начала или окончания или воспользуйтесь escape-символом.

Директива указана в неправильном формате.Директива будет проигнорирована.Укажите директиву в #> имени <#@ формата [""] * parametername= parametervalue

Отображается синтаксическим анализатором, если директива не указана в правильном формате.Сообщение предоставляет номер строки неправильной директивы.

Убедитесь, что все рекомендации в #> имени <#@ формы [parametername= " parametervalue"] *.Дополнительные сведения см. в разделе Директивы текстовых шаблонов T4.

Не удалось загрузить сборку "{0}" для зарегистрированного процессора директив "{1}"

{2}

Возникает, когда процессор директив не может быть загружен узлом.Сообщение идентифицирует сборку, предоставленную для процессора директив, и имя этого процессора директив.

Убедитесь, что процессор директив зарегистрирован правильно и что сборка существует.

Не удалось найти тип "{0}" в сборке "{1}" для зарегистрированного процессора директив "{2}"

{3}

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

Vshost находит сведения о процессоре директив (имя, сборка и тип) в реестре.Убедитесь, что процессор директив зарегистрирован правильно и что данный тип существует в сборке.

Ошибка при загрузке сборки "{0}"

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

Можно задать загрузку сборки в директивах <@#assembly#> и с помощью процессоров директив.Сообщение об ошибке, которое следует за этой строкой, должно предоставлять дополнительные данные о том, почему загрузка сборки завершилась неудачно.

При создании и инициализации процессора для директивы с именем "{1}" возникла проблема.Тип процессора: "{0}".Директива будет проигнорирована.

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

Убедитесь, что используется правильный процессор директив и что он имеет открытый конструктор по умолчанию.В противном случае используйте параметры отладки, чтобы узнать, почему произошел сбой метода Initialize() процессора директив.Дополнительные сведения см. в разделе Отладка текстового шаблона T4.

При обработке директивы с именем "{0}" возникло исключение.

Возникает, когда процессор директив создает исключение при обработке директивы.

Убедитесь в правильности параметров для процессора директив.

Узел вызвал исключение при попытке разрешить ссылку на сборку "{0}".

Возникает, когда узел вызывает исключение при попытке разрешить ссылку на сборку.Сообщение предоставляет строку ссылки на сборку.

Сборки ссылки берутся из директив <@ #сборки#> и из процессоров директив.Убедитесь, что параметр "имя", предоставленный в параметре сборки, правильный.

Попытка указать неподдерживаемое {1} значение "{0}" для директивы {2}

Вызывается процессором RequiresProvidesDirectiveProcessor (все созданные процессоры директив производятся от него) при указании неподдерживаемого атрибута требования или предоставления.

Убедитесь, что имена в парах "имя=значение" предоставлены там, где требуется, и что предоставленные параметры правильны.