我正在使用T4进行代码生成。它运行良好,但我想做的一件事是一些简单的日志记录,如果这只是将消息抛出到Output窗口,我很高兴。
有没有人知道这样做的方法?
或者,我知道存在Error()&用于将内容转储到“错误列表”窗格的Warning()方法,是否有类似的转储信息性消息?
答案 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");
祝你好运!