Как отладить исключение System.NullReferenceException при выполнении преобразования?

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

Running transformation: System.NullReferenceException: Object reference not set to an instance of an object.
   at Microsoft.VisualStudio.TextTemplatingB0A58A4C85EA3D7032675015C6052C89.GeneratedTextTransformation.TransformText()
   at Microsoft.VisualStudio.TextTemplating.TransformationRunner.RunTransformation(TemplateProcessingSession session, String source, ITextTemplatingEngineHost host, String& result)

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


person Ryan Kohn    schedule 24.07.2012    source источник
comment
Я не могу найти внутреннее исключение.   -  person Ryan Kohn    schedule 24.07.2012


Ответы (2)


Вам нужно будет отладить свой шаблон, чтобы найти, где происходит NullReferenceException. У Тима Ларсона есть краткий обзор здесь, а у Олега Сыча есть еще подробности здесь, а также его другие отличные записи в блоге на T4.

Вот краткая короткая версия:

  1. Добавьте debug="true" в директиву шаблона: <#@ template debug="true" #>
  2. Запустить отладчик System.Diagnostics.Debugger.Launch();
  3. Перерыв System.Diagnostics.Debugger.Break();
  4. Выберите Новый экземпляр Microsoft Visual Studio в диалоговом окне Just-In-Time Debugger и нажмите Да.
  5. Отладьте свой шаблон T4

Вот простой пример, помогающий поймать NullReferenceException при вызове ToString на баре:

<#@ template debug="true" language="C#" #>
<#@ output extension=".txt" #>
<#
    System.Diagnostics.Debugger.Launch();
    System.Diagnostics.Debugger.Break();

    object bar = null;  
#>
foo<#= bar.ToString() #>

Обязательно проверьте первую ссылку, так как в некоторых версиях вам потребуется обновить раздел реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\DbgJITDebugLaunchSetting до 0x2, чтобы все работало правильно.

person Scott Lerch    schedule 24.07.2012

Вы можете отладить свой шаблон T4. MSDN предоставляет помощь по этому.

В режиме отладки вы можете просмотреть сгенерированные классы, чтобы выяснить, что пошло не так. T4 сохраняет сгенерированный код, сборки и PDB в папке TEMP (%USERPROFILE%\Local Settings\Temp). CS-файл содержит исходный код GeneratedTextTransformation. Файл .cmdline содержит параметры командной строки, используемые для компиляции файла .cs в сборку .NET (файл .dll).

person Wolfgang Ziegler    schedule 24.07.2012