Отладка текстового шаблона T4
Можно установить точки останова в текстовых шаблонах.Для отладки текстового шаблона времени разработки, выберите в контекстном меню Отладить шаблон T4 файла текстового шаблона в обозревателе решений.Для отладки текстового шаблона среды выполнения, просто отладка приложения, к которому он принадлежит.
Для отладки текстового шаблона, необходимо понимать шаги процесса преобразования шаблона.Различные типы ошибок могут появиться внутри каждого шага.Вот что это за шаги.
Шаг |
Шаблон времени разработки: происходит, когда он |
Шаблон времени выполнения: происходит, когда он |
---|---|---|
Код создается из текстового шаблона. Ошибки в директивах или рассогласованных или disordered тегах <#…#>. |
При сохранении шаблона или вызвать преобразование текста. |
При сохранении шаблона или вызвать преобразование текста. |
Созданный код компилироваться. Ошибки компиляции в коде шаблона. |
Сразу после предыдущего шага. |
Вместе с кодом приложения. |
Закодируйте запуска. Ошибки во время выполнения в коде шаблона. |
Сразу после предыдущего шага. |
Когда приложение запускается и вызывающий код шаблона. |
В большинстве случаев номера строк в коде шаблона отображаются в отчете об ошибках.Если отчет об ошибках ссылается на временное имя файла, частой причиной является непарная скобка в коде текстового шаблона.
Можно установить точки останова в текстовых шаблонах и отладку обычным способом.
Распространенные ошибки и исправления
В следующей таблице приведены наиболее частые ошибки и способы их устранения.
Сообщение об ошибке |
Описание |
Решение |
---|---|---|
Не удалось загрузить базовый класс "{0}", от которого наследует класс преобразования. |
Возникает, если не удается найти базовый класс, указанный в параметре inherits в директиве "шаблон".В сообщении указывается номер строки директивы шаблона. |
Убедитесь, что указанный класс существует и сборка, в которой он находится, указана в директиве сборок. |
Не удалось разрешить текст включения для файла:{0} |
Возникает, когда не удается найти включенный шаблон.Сообщение предоставляет имя запрошенного файла включения. |
Убедитесь, что путь к файлу задается относительно исходного пути шаблона, или что файл находится в расположении, зарегистрированном с узлом, или что это полный путь к файлу. |
При инициализации объекта преобразования возникли ошибки.Преобразование не будет выполнено. |
Возникает, когда "Initialize()" класса преобразования завершается со сбоем или возвращает значение "false". |
Код в функцию Initialize() поступает из базового класса преобразования, указанного в директиве <#@template#> и из процессоров директив.Ошибка, вызвавшая неудачное завершение инициализации, вероятно находится в списке ошибок.Исследуйте причину сбоя.Можно посмотреть на фактическое созданный код метода Initialize(), выполнив следующие процедуры для отладки шаблона. |
Сборке "{0}"для процессора директив "{1}" не был предоставлен набор разрешений FullTrust.Только доверенным сборкам разрешается поставлять директивы процесса.Этот процессор директив не будет загружен. |
Возникает, когда система не предоставляет разрешения FullTrust сборке, содержащей процессор директив.Сообщение предоставляет имя сборки и имя процессора директивы. |
Убедитесь, что на локальном компьютере используются только надежные сборки. |
Путь "{0}" должен быть локальным для этого компьютера или частью доверенной зоны. |
Возникает, когда директива или директива сборки ссылается на файл, находящийся не на локальном компьютере и не в надежной зоне сети. |
Убедитесь в том, что каталог, в котором расположена директива, или директивы сборки расположены в надежной зоне.Можно добавить сетевой каталог в доверенную зону с помощью Internet Explorer. |
Несколько синтаксических ошибок, таких как «Недопустимый токен "catch"» или "Пространство имен не может непосредственно содержать элементы" |
Слишком много закрывающих скобок в коде шаблона.Компилятор путает его со стандартным кодом создания. |
Проверьте число закрывающих скобок и квадратные скобки внутри разделителей кода. |
Циклы или условные выражения не компилируется или не выполняется правильно.Например:
Этот код всегда выводит значение i.Только "номер:" является условным. |
В C# всегда используйте скобки вокруг текстовых блоков, внедренных в операторы управления. |
Добавьте фигурные скобки:
|
«Слишком сложное выражение» при обработке шаблона во время разработки или компиляции шаблона (предварительно обработанного) во время выполнения. 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 (все созданные процессоры директив производятся от него) при указании неподдерживаемого атрибута требования или предоставления. |
Убедитесь, что имена в парах "имя=значение" предоставлены там, где требуется, и что предоставленные параметры правильны. |