2014-10-03 7 views
11

का उपयोग करते समय आउटपुट विंडो पर लॉग इन करें मैं कोड पीढ़ी के लिए टी 4 का उपयोग कर रहा हूं। यह अच्छी तरह से काम कर रहा है लेकिन एक चीज जो मैं करना चाहता हूं वह कुछ सरल लॉगिंग है, मुझे खुशी है कि अगर यह आउटपुट विंडो में संदेशों को फेंकने का रूप लेता है।टी 4

क्या कोई इसे करने का तरीका जानता है?

वैकल्पिक रूप से, मुझे पता है कि त्रुटि मौजूद है() & त्रुटि सूची फलक में सामान डंप करने के लिए चेतावनी() विधियां, क्या सूचनात्मक संदेशों को डंप करने के लिए कुछ भी समान है?

+0

शायद मैं गलत कर रहा हूँ, लेकिन आप अगर तुम उत्पादन विंडो पर लॉग ऑन करने में सक्षम होगा डीबग मोड –

+0

में अपने टेम्पलेट्स निष्पादित करें आप अपनी टी 4 फाइलों में 'System.Diagnostics.Debug.WriteLine' डाल सकते हैं। आप 'System.Diagnostics.Debugger.Break' के साथ भी तोड़ सकते हैं। –

+3

धन्यवाद दोस्तों। कॉलिंग सिस्टम। डायग्नोस्टिक्स। डेबग। राइटलाइन() काम नहीं किया मैं डर रहा हूँ। – jamiet

उत्तर

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

होस्टस सर्विसप्रोवाइडर कहां से आ रहा है। –

+0

@DylanHayes - मैंने पूरा मूल टेम्पलेट शामिल किया है; अनिवार्य रूप से सक्रिय दृश्य स्टूडियो (यह। होस्ट) को इंगित करने वाला एक इंटरफ़ेस; और केवल hostpecific = "true" T4 टेम्पलेट्स के लिए उपलब्ध है। –

+0

कमाल! मदद के लिए thx, मैंने टिप्पणी पूछने के कुछ ही समय बाद इसे खत्म कर दिया, लेकिन अब यह उन लोगों के लिए होगा जो लोगों को कुछ समय बचा सकते हैं। स्व-परीक्षा! –

7

यह नहीं वास्तव में क्या आप के लिए कहा है, लेकिन आप debug a T4 template from within visual studio, बस ठीक "डीबग टी -4 खाका" क्लिक कर सकते हैं।

यदि आप ऐसा करते हैं तो राज्य को रखने के लिए यह इतना आसान है कि आप किसी चर में आउटपुट विंडो में भेज रहे हों।

4

ओंद्रेज के जवाब के आधार पर, मैं एक आसान समारोह है कि मैं अपने टेम्पलेट्स डिबग करने के लिए उपयोग कर रहे हैं लिखा है:

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

यह अब वीएस 2017 में काम नहीं कर रहा है। मुझे विंडो वैरिएबल सेट करने वाली रेखा पर '' 'SerializationException''' मिलता है। – bzuillsmith

संबंधित मुद्दे