Отладка предварительно обработанных шаблонов T4 не работает - Visual Studio 2010 RTM - PullRequest
8 голосов
/ 18 августа 2010

Я пытаюсь отладить предварительно обработанный шаблон T4, и я не могу войти в класс, созданный путем запуска предварительно обработанного шаблона.Я могу создать экземпляр класса, но как только я пытаюсь войти во время отладки, появляется новое окно, которое говорит:

Источник недоступен.Для текущего местоположения исходный код недоступен.

Насколько я понимаю, предварительно обработанные шаблоны можно отлаживать так же, как обычный класс c #, не так ли?Что конкретно вам нужно сделать, чтобы иметь возможность войти в класс, определенный предварительно обработанным шаблоном?

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

TestPreprocessedTemplate.tt:

<#@ template language="C#" debug="true" #>
Hello <# Write("World"); #>

Код теста:

var template = new TestPreprocessedTemplate();
string test = template.TransformText();

Редактировать - Добавленоутверждение debug = "true" согласно предложенному ниже предложению по-прежнему имеет ту же проблему.

Обновление - я также разместил этот вопрос на форумах MSDN и получил ответ от сотрудника MS, в котором указано "да"то, что я описал выше , должно действительно работать.Кто-нибудь еще сталкивался с этой проблемой?

Обновление - С некоторой помощью форумов MSDN, похоже, проблема в директивах #line, которые добавляются в сгенерированный класс c #.Комментируя их, я перешагиваю код, как и ожидалось. Есть ли способ предотвратить добавление этих директив в сгенерированный класс? С помощью страницы ASP.NET вы можете добавить параметр LinePragmas = "false", но, похоже, он не влияет на T4шаблон.Есть идеи?

Ответы [ 3 ]

2 голосов
/ 25 августа 2010

в Visual Studio 2010 вам нужно вызвать Debugger.Launch () перед Debugger.Break ().

Олег - мастер, которого я проверю. http://www.olegsych.com/2008/09/t4-tutorial-debugging-code-generation-files/

1 голос
/ 21 сентября 2011

Обновление - с некоторой помощью форумов MSDN похоже, что проблема в директивах #line, которые добавляются в сгенерированный класс c #.Комментируя их, я перешагиваю код, как и ожидалось.Есть ли способ предотвратить добавление этих директив в сгенерированный класс?На странице ASP.NET вы можете добавить параметр LinePragmas = "false", но это не оказывает никакого влияния на шаблон T4.Любые идеи?

Директивы #line на самом деле создают проблемы при отладке предварительно обработанных шаблонов T4 (отладчик всегда ищет файл * .tt вместо сгенерированного файла * .cs),Я не смог найти ни одного варианта поворота генерации директив #line.Поэтому я использую следующий макрос VisualStudio, чтобы избавиться от них

Sub RemoveLineDirectives()
   DTE.ActiveDocument.Selection.SelectAll()
   DTE.ActiveDocument.Selection.ReplaceText("#line", "//#line")
End Sub

Я всегда назначаю макрос какой-то короткой команде в командном окне

alias rl Macros.MyMacros.Module1.RemoveLineDirectives

Так что я 'я могу удалить директивы #line, просто вызвав rl в командном окне, когда сгенерированный файл * .cs активен, когда мне нужно отладить шаблон Preprocessed T4.После удаления директивы #line отладка сгенерированный шаблонный класс работает как положено.

Не идеальное решение, но оно работает:)

1 голос
/ 18 августа 2010

Похоже, вы пропустили элемент debug="true" в заголовке шаблона, который необходим для отладки.

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

...