2014-10-03 8 views
11

Ich verwende T4 für die Code-Generierung. Es funktioniert gut, aber eine Sache, die ich tun möchte, ist eine einfache Protokollierung, ich bin glücklich, wenn dies einfach die Form von Nachrichten in das Ausgabefenster werfen würde.Log auf Ausgabefenster bei Verwendung von T4

Kennt jemand einen Weg, dies zu tun?

Alternativ, ich weiß, gibt es Fehler() & Warning() -Methoden zum Dumping Zeug in die Error List-Bereich, gibt es etwas Ähnliches für Dumping Informationsnachrichten?

+0

Vielleicht irre ich bin, aber man würde Ausgabefenster anmelden können, wenn würden Sie Führen Sie Ihre Vorlagen im Debug-Modus aus –

+0

Sie können 'System.Diagnostics.Debug.WriteLine' in Ihre T4-Dateien einfügen. Sie können auch mit 'System.Diagnostics.Debugger.Break' brechen. –

+3

Danke Leute. System.Diagnostics.Debug.WriteLine() hat nicht funktioniert Ich habe Angst. – jamiet

Antwort

0

Für das Ausgabefenster:

<#@ 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

Woher kommt der hostServiceProvider? –

+0

@DylanHayes - Ich habe die vollständige Vorlage eingefügt; im Wesentlichen ist es eine Schnittstelle zum aktiven Visual Studio (this.Host); und ist nur für hostspecific = "echte" T4-Vorlagen verfügbar. –

+0

genial! Danke für die Hilfe, ich habe es herausgefunden, kurz nachdem ich den Kommentar gefragt habe, aber jetzt wird es für andere da sein, die Leute vielleicht etwas Zeit sparen könnten. TY! –

7

Es ist nicht genau das, was Sie gefragt, aber Sie können debug a T4 template from within visual studio, genau richtig auf „Debug T4 Vorlage“.

Wenn Sie dies tun, ist es einfach genug, um den Zustand zu behalten, den Sie an das Ausgabefenster in einer Variablen irgendwo senden würden.

4

Basierend auf Ondrej Antwort schrieb ich eine praktische Funktion, die ich habe meine Vorlagen wurden mit debuggen:

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

Das scheint nicht mehr in VS 2017 zu funktionieren. Ich bekomme eine '' 'SerializationException''' in der Zeile, die die Fenstervariable setzt. – bzuillsmith