2014-10-03 19 views
11

我使用T4进行代码生成。它的工作很好,但我想要做的一件事就是简单的日志记录,如果这只是将消息投掷到Output窗口中,我很高兴。使用T4时登录到输出窗口

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

另外,我知道存在错误()&警告()方法转储到错误列表窗格的东西,有没有类似的转储信息消息?

+0

也许我错了,可是你就可以,如果你会登录到输出窗口在调试模式下执行你的模板 – 2014-10-03 07:14:53

+0

你可以把'System.Diagnostics.Debug.WriteLine'放到你的T4文件中。你也可以使用'System.Diagnostics.Debugger.Break'来破解。 – 2014-10-03 07:18:10

+3

谢谢大家。调用System.Diagnostics.Debug.WriteLine()没有用,我很害怕。 – jamiet 2014-10-03 13:16:07

回答

0

对于输出窗口:

<#@ 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; 
    } 
} 
#> 
+0

哪里是来自的hostServiceProvider。 – 2017-02-01 16:12:42

+0

@DylanHayes - 我已经包含完整的原始模板;本质上它是一个指向活动视觉工作室的界面(this.Host);并且仅适用于hostspecific =“true”T4模板。 – 2017-02-01 16:58:38

+0

真棒! thx寻求帮助,我在问完评论后不久就想出了它,但现在它将在那里用于其他可能为人们节省时间的其他人。 TY! – 2017-02-01 17:36:21

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"); 
} 
+0

这似乎不再适用于VS 2017.我在设置窗口变量的行上出现'''SerializationException'''。 – bzuillsmith 2017-11-01 21:42:41