我使用T4进行代码生成。它的工作很好,但我想要做的一件事就是简单的日志记录,如果这只是将消息投掷到Output窗口中,我很高兴。使用T4时登录到输出窗口
有没有人知道这样做的方式?
另外,我知道存在错误()&警告()方法转储到错误列表窗格的东西,有没有类似的转储信息消息?
我使用T4进行代码生成。它的工作很好,但我想要做的一件事就是简单的日志记录,如果这只是将消息投掷到Output窗口中,我很高兴。使用T4时登录到输出窗口
有没有人知道这样做的方式?
另外,我知道存在错误()&警告()方法转储到错误列表窗格的东西,有没有类似的转储信息消息?
对于输出窗口:
<#@ 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;
}
}
#>
哪里是来自的hostServiceProvider。 – 2017-02-01 16:12:42
@DylanHayes - 我已经包含完整的原始模板;本质上它是一个指向活动视觉工作室的界面(this.Host);并且仅适用于hostspecific =“true”T4模板。 – 2017-02-01 16:58:38
真棒! thx寻求帮助,我在问完评论后不久就想出了它,但现在它将在那里用于其他可能为人们节省时间的其他人。 TY! – 2017-02-01 17:36:21
这不是你问什么的,但你可以debug a T4 template from within visual studio,只需右键单击“调试T4模板”。
如果你这样做很容易保持你将发送到某个变量的输出窗口的状态。
基于的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");
}
这似乎不再适用于VS 2017.我在设置窗口变量的行上出现'''SerializationException'''。 – bzuillsmith 2017-11-01 21:42:41
也许我错了,可是你就可以,如果你会登录到输出窗口在调试模式下执行你的模板 – 2014-10-03 07:14:53
你可以把'System.Diagnostics.Debug.WriteLine'放到你的T4文件中。你也可以使用'System.Diagnostics.Debugger.Break'来破解。 – 2014-10-03 07:18:10
谢谢大家。调用System.Diagnostics.Debug.WriteLine()没有用,我很害怕。 – jamiet 2014-10-03 13:16:07