我正在使用T4进行代码生成.它运行良好,但我想做的一件事是一些简单的日志记录,如果这只是采取将消息抛出到输出窗口的形式,我很高兴.
有谁知道这样做的方法?
或者,我知道存在用于将内容转储到错误列表窗格的Error()和Warning()方法,是否有类似的转储信息消息?
更新@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)
祝你好运!
根据 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)
| 归档时间: |
|
| 查看次数: |
3905 次 |
| 最近记录: |