使用T4时记录到输出窗口

jam*_*iet 12 .net t4

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

有谁知道这样做的方法?

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

abo*_*021 7

这不是你要求的,但你可以在visual studio中调试T4模板,只需右键单击"Debug T4 Template".

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


Mar*_*ATS 6

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

<#@ template hostspecific="true" language="C#" #>
<#@ assembly name="EnvDTE" #>
<#@ import namespace="Microsoft.VisualStudio.TextTemplating" #>
Run Code Online (Sandbox Code Playgroud)

然后修改@jkheadley的函数如下。(对于那些不太熟悉*.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 /sf/answers/3734273721/
  // 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");
}
Run Code Online (Sandbox Code Playgroud)

然后,在模板正文中*.tt,以历史悠久的方式测试它:

WriteToOutput("hello, world");
Run Code Online (Sandbox Code Playgroud)

祝你好运!


jkh*_*ley 5

根据 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");
}
Run Code Online (Sandbox Code Playgroud)