Войдите в окно вывода при использовании T4

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

Кто-нибудь знает способ сделать это?

В качестве альтернативы, я знаю, что существуют методы Error() и Warning() для сброса данных в панель списка ошибок, есть ли что-то подобное для сброса информационных сообщений?

Ответ 1

Это не совсем то, о чем вы просили, но вы можете отладить шаблон T4 из визуальной студии, просто щелкните правой кнопкой мыши "Debug T4 Template".

Если вы сделаете это, достаточно легко сохранить состояние, которое вы отправляете в выходное окно где-нибудь в переменной.

Ответ 2

На основе ответа Ondrej я написал удобную функцию, которую я использовал для отладки моих шаблонов:

private void WriteToOutput(string output)
{
  IServiceProvider hostServiceProvider = (IServiceProvider)Host;
  if (hostServiceProvider == null)
    throw new Exception("Host property returned unexpected value (null)");

  EnvDTE.DTE dte = (EnvDTE.DTE)hostServiceProvider.GetService(typeof(EnvDTE.DTE));
  if (dte == null)
    throw new Exception("Unable to retrieve EnvDTE.DTE");

  var window = dte.Windows.Item(EnvDTE.Constants.vsWindowKindOutput);
  var outputWindow = (OutputWindow) window.Object;
  outputWindow.ActivePane.Activate();

  outputWindow.ActivePane.OutputString(output);
  outputWindow.ActivePane.OutputString("\n");
}

Ответ 3

Для окна вывода:

<#@ template debug="true" hostspecific="true" language="C#" #>
<#@ assembly name="EnvDTE" #>
<#@ import namespace="EnvDTE" #>
<#@ import namespace="System.Runtime.InteropServices" #>
<#@ output extension=".txt" #>

<#
var hostServiceProvider = (IServiceProvider)this.Host;
var dte = (DTE)GetCOMService(hostServiceProvider, typeof(DTE));
var window = dte.Windows.Item(EnvDTE.Constants.vsWindowKindOutput);
var outputWindow = (OutputWindow) window.Object;
outputWindow.ActivePane.Activate();
outputWindow.ActivePane.OutputString("Hello world, this is T4 template");
#>

<#+
private object GetCOMService(IServiceProvider provider, Type type)
{
  object result = provider.GetService(type);
  if (result == null)
  {
     return result;
  }

  try
  {
    return Marshal.GetObjectForIUnknown(Marshal.GetIUnknownForObject(result));
  }
  catch (Exception)
  {
    return result;
  }
}
#>