使用T4时记录到输出窗口

时间:2014-10-03 07:10:12

标签: .net t4

我正在使用T4进行代码生成。它运行良好,但我想做的一件事是一些简单的日志记录,如果这只是将消息抛出到Output窗口,我很高兴。

有没有人知道这样做的方法?

或者,我知道存在Error()&用于将内容转储到“错误列表”窗格的Warning()方法,是否有类似的转储信息性消息?

3 个答案:

答案 0 :(得分:7)

这不完全是您要求的,但您可以debug a T4 template from within visual studio,只需右键单击"调试T4模板"。

如果你这样做,它很容易保持你在某个变量发送到输出窗口的状态。

答案 1 :(得分:4)

根据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");
}

答案 2 :(得分:1)

更新@jkheadley's answer ...在Visual Studio 2019中,如果您“调试T4模板”,则不会发生错误,但如果您“运行自定义工具”,则不会发生错误。解决方案(找到on SO here)是将以下内容添加到*.tt文件的标题中:

<#@ template hostspecific="true" language="C#" #>
<#@ assembly name="EnvDTE" #>
<#@ import namespace="Microsoft.VisualStudio.TextTemplating" #>

然后如下修改@jkheadley's function。 (对于不太熟悉*.tt模板的人(例如我自己),请将下面的函数添加到*.tt模板文件的底部。)

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

  IServiceProvider serviceProvider = (IServiceProvider)this.Host;
  // Visual Studio 2019: per https://stackoverflow.com/a/53346767
  // get DTE object via Microsoft wrapper
  EnvDTE.DTE dte = (EnvDTE.DTE) serviceProvider.GetCOMService(typeof(EnvDTE.DTE));
  if (dte == null)
    throw new Exception("Unable to retrieve EnvDTE.DTE");
  var window = dte.Windows.Item(EnvDTE.Constants.vsWindowKindOutput);
  var outputWindow = window.Object as EnvDTE.OutputWindow;
  if (outputWindow == null)
    throw new Exception("Unable to obtain OutputWindow object");
  outputWindow.ActivePane.Activate();
  outputWindow.ActivePane.OutputString(output);
  outputWindow.ActivePane.OutputString("\n");
}

然后,在您的*.tt模板的主体中,以历史悠久的方式对其进行测试:

WriteToOutput("hello, world");

祝你好运!