2009-07-07 14 views
27

मैं एक कस्टम टूल लिख रहा हूं और वर्तमान में यह वही कर रहा है जो मैं कार्यक्षमता तक चाहता हूं। अगर कुछ गलत हो जाता है तो मैं विजुअल स्टूडियो को लिखने में सक्षम होना चाहता हूं। (गलत रूप से स्वरूपित कोड या जो कुछ भी)।मैं अपने कस्टम टूल में विजुअल स्टूडियो आउटपुट विंडो को कैसे लिखूं?

क्या इसके लिए कोई मानदंड है? अभी मैं मूल रूप से उपकरण को असफल होने के लिए मजबूर कर सकता हूं और विजुअल स्टूडियो ने चेतावनी दी है कि उसने ऐसा किया है। मैं आउटपुट विंडो में किसी भी परिणामस्वरूप संदेश भेजना चाहता हूं जिसके साथ मैं भेजना चाहता हूं। मैं त्रुटि सूची विंडो में एक और वर्णनात्मक कार्य/चेतावनी के साथ भी रह सकता था।

+0

क्यों मानक आउटपुट आप के लिए काम करने के लिए लिख नहीं है? – avakar

+0

कंसोल पर एक संदेश लिखना। मुझे आउटपुट विंडो में कुछ भी नहीं देता है। –

उत्तर

44

आउटपुट विंडो

दृश्य स्टूडियो में "सामान्य" उत्पादन खिड़की को लिखने के लिए, आपको निम्न कार्य करने होंगे:

IVsOutputWindow outWindow = Package.GetGlobalService(typeof(SVsOutputWindow)) as IVsOutputWindow; 

Guid generalPaneGuid = VSConstants.GUID_OutWindowGeneralPane; // P.S. There's also the GUID_OutWindowDebugPane available. 
IVsOutputWindowPane generalPane; 
outWindow.GetPane(ref generalPaneGuid , out generalPane); 

generalPane.OutputString("Hello World!"); 
generalPane.Activate(); // Brings this pane into view 

अगर, हालांकि, आप एक कस्टम खिड़की को लिखना चाहते हैं, IVsOutputWindow और IVsOutputWindowPane पर

IVsOutputWindow outWindow = Package.GetGlobalService(typeof(SVsOutputWindow)) as IVsOutputWindow; 

// Use e.g. Tools -> Create GUID to make a stable, but unique GUID for your pane. 
// Also, in a real project, this should probably be a static constant, and not a local variable 
Guid customGuid = new Guid("0F44E2D1-F5FA-4d2d-AB30-22BE8ECD9789"); 
string customTitle = "Custom Window Title"; 
outWindow.CreatePane(ref customGuid, customTitle, 1, 1); 

IVsOutputWindowPane customPane; 
outWindow.GetPane(ref customGuid, out customPane); 

customPane.OutputString("Hello, Custom World!"); 
customPane.Activate(); // Brings this pane into view 

विवरण MSDN पर पाया जा सकता है: यह आप क्या करने की जरूरत है।

त्रुटि सूची

त्रुटि सूची में आइटम जोड़ने के लिए, IVsSingleFileGenerator एक विधि कॉल void Generate(...) किस प्रकार IVsGeneratorProgress की एक पैरामीटर है है। इस इंटरफेस में एक विधि void GeneratorError() है जो आपको विजुअल स्टूडियो त्रुटि सूची में त्रुटियों और चेतावनियों की रिपोर्ट करने देती है।

public class MyCodeGenerator : IVsSingleFileGenerator 
{ 
    ... 
    public void Generate(string inputFilePath, string inputFileContents, string defaultNamespace, out IntPtr outputFileContents, out int output, IVsGeneratorProgress generateProgress) 
    { 
     ... 
     generateProgress.GeneratorError(false, 0, "An error occured", 2, 4); 
     ... 
    } 
    ... 
} 

GeneratorError() का विवरण एमएसडीएन पर पाया जा सकता है।

+0

कस्टम विंडो के लिए: यदि मैं (वीएस -2010) आपके समाधान का उपयोग करता हूं, तो मुझे एक अच्छा विंडो फलक मिलता है जो कुछ भी प्रदर्शित नहीं करता है। अगर मैं इसे आउटविंडो में बदलता हूं। क्रेतेपेन (रेफ कस्टमगुइड, कस्टमटाइटल, 1, 0); सब ठीक है ... इस परिवर्तन का मतलब है कि समाधान बंद होने के बाद विंडो को साफ़ नहीं किया गया है, और मैं नहीं देख सकता कि खिड़की के लिए कुछ भी क्यों प्रदर्शित करना आवश्यक है। क्या आप? – BennyBarns

+0

क्षमा करें, मुझे कोई जानकारी नहीं है। मैंने इस बात को वीएस -2008 के लिए लिखा है, और मैंने वास्तव में उस समय से वीएस प्लगइन विकास के साथ निपटाया नहीं है ... – Alex

+0

मेरे मामले में, पैनल सक्रिय नहीं हो रहा है। 'customPane.Activate(); 'काम नहीं कर रहा है। कोई उपाय? –

0

आप डीबग और/या ट्रेस कक्षाओं का उपयोग कर सकते हैं। यहां कुछ जानकारी दी गई है: http://msdn.microsoft.com/en-us/library/bs4c1wda(VS.71).aspx

शुभकामनाएँ।

+1

मैंने यह पूछने से पहले trace.write (संदेश, श्रेणी) की कोशिश की और यह आउटपुट नहीं हुआ। –

4

आप कुछ भी आउटपुट विंडो में प्रकट करने के लिए चाहते हैं, यह stdout से आने के लिए है। ऐसा करने के लिए, आपके ऐप को "कंसोल" ऐप के रूप में लिंक करने की आवश्यकता है।/SUBSYSTEM सेट करें: प्रोजेक्ट के प्रॉपर्टी पेज में कंसोल फ्लैग, लिंकर/सिस्टम के तहत सबसिस्टम प्रॉपर्टी को कंसोल पर सेट करें।

एक बार जब आप विंडो में अपने उत्पादन, यदि आप पाठ में शामिल हैं "त्रुटि:" यह एक त्रुटि के रूप में दिखाई देगा, या यदि आप "चेतावनी:" सेट यह एक चेतावनी के रूप में दिखाई देगा। यदि आपका त्रुटि टेक्स्ट पथ/फ़ाइल नाम से शुरू होता है, उसके बाद ब्रांड्स में एक पंक्ति संख्या के बाद, आईडीई इसे "क्लिक करने योग्य" त्रुटि के रूप में पहचाना जाएगा, और आपको स्वचालित रूप से दोषपूर्ण रेखा पर नेविगेट करेगा।

+0

मैं इसे सी # में कर रहा हूं और प्रोजेक्ट प्रॉपर्टी में कोई सबसिस्टम सामग्री नहीं है, क्या मुझे ऐसा करने के लिए कंसोल ऐप बनाने की ज़रूरत है? यह अभी एक डीएलएल के रूप में काम कर रहा है, लेकिन जाहिर है कि मुझे आउटपुट नहीं मिल रहा है। –

+0

यह एक डीएलएल है? इसका आह्वान कैसे किया जा रहा है? आम तौर पर, आउटपुट विंडो उपकरण श्रृंखला में निष्पादित उपकरण को कैप्चर करती है जो एमएसबिल्ड निर्माण करती है, लेकिन जहां तक ​​मुझे पता था कि वे सभी स्वतंत्र निष्पादन योग्य थे, और एमएसबिल्ड बस खिड़की में प्रदर्शन के लिए सभी स्टडआउट को कैप्चर करेगा। यह सिर्फ मेरे लिए हुआ कि आपका कस्टम टूल इमारत से संबंधित नहीं हो सकता है। "आउटपुट" विंडो बिल्ड प्रक्रिया के लिए आरक्षित है। यदि आप रन-टाइम जानकारी डालना चाहते हैं, तो आपको डीबग विंडो (आउटपुटडिबगस्ट्रिंग() या डीबग.प्रिंट() या जो भी हो, का उपयोग करना चाहिए।) –

+2

धन्यवाद, जॉन। मुझे पता चला कि एमएसबिल्ड में किस्मत के माध्यम से एक त्रुटि कैसे बनाएं और चेतावनी कैसे बनाएं, इस बारे में वेब खोज रहे थे। दिलचस्प बात यह है कि आपका विवरण सीधे मेरे लिए काम नहीं करता था। मुझे इसे आउटपुट करके काम करने के लिए मिला ": चेतावनी: " (उद्धरण चिह्न/डब्ल्यू/ओ)। विजुअल स्टूडियो अग्रणी कोलन चाहता था, जिसका उपयोग चेतावनी पाठ से फ़ाइल/लाइन # जानकारी को अलग करने के लिए किया जाता है, अगर चेतावनी किसी विशेष फ़ाइल/लाइन # से जुड़ी है। किसी कारण से, वीएस 2008 सिर्फ "चेतावनी: पाठ" स्वीकार नहीं करेगा। इसके अलावा, इससे कोई फर्क नहीं पड़ता कि आउटपुट स्ट्रीम stdout, stderr, आदि था और यह केस-संवेदी है। Geesh। –

-2

उपयोग System.Diagnostics.Debugger.Message

7

Marshal.GetActiveObject का उपयोग कर मौजूदा DTE2 उदाहरण हड़पने के लिए एक और तरीका है।

पहले संदर्भ EnvDTE और envdte80। यह वर्तमान में विजुअलस्टूडियो 2012 में काम करता है, मैंने अभी तक दूसरों की कोशिश नहीं की है।

using System; 
using System.Runtime.InteropServices; 
using EnvDTE; 
using EnvDTE80; 

internal class VsOutputLogger 
{ 
    private static Lazy<Action<string>> _Logger = new Lazy<Action<string>>(() => GetWindow().OutputString); 

    private static Action<string> Logger 
    { 
     get { return _Logger.Value; } 
    } 

    public static void SetLogger(Action<string> logger) 
    { 
     _Logger = new Lazy<Action<string>>(() => logger); 
    } 

    public static void Write(string format, params object[] args) 
    { 
     var message = string.Format(format, args); 
     Write(message); 
    } 

    public static void Write(string message) 
    { 
     Logger(message + Environment.NewLine); 
    } 

    private static OutputWindowPane GetWindow() 
    { 
     var dte = (DTE2) Marshal.GetActiveObject("VisualStudio.DTE"); 
     return dte.ToolWindows.OutputWindow.ActivePane; 
    } 
} 
+0

स्वीकृत उत्तर मेरे लिए वीएस -2010 में काम नहीं करता है, जबकि यह – smirkingman

+2

करता है हालांकि यह काम करता है, यदि आपके पास एकाधिक विजुअल स्टूडियो इंस्टेंस खुले हैं, तो संदेश शायद आपके द्वारा खोले गए पहले में समाप्त हो जाएगा। –