2010-04-15 14 views
13

मेरे पास कंसोल का एक गुच्छा है। मेरे कोड में राइटलाइन जो मैं रनटाइम पर देख सकता हूं। मैं एक मूल पुस्तकालय के साथ संवाद करता हूं जिसे मैंने भी लिखा था।कंसोल के साथ समस्याएं। रिलीज मोड में सेटऑट?

मैं कुछ प्रिंटर को मूल पुस्तकालय में चिपकाना चाहता हूं और उन्हें भी देखना चाहता हूं। हालांकि मैं उन्हें रनटाइम पर नहीं देखता हूं।

मैंने अपनी समस्या का प्रदर्शन करने के लिए एक ठोस हैलो वर्ल्ड ऐप बनाया है। जब ऐप चलता है, तो मैं मूल पुस्तकालय में डीबग कर सकता हूं और देख सकता हूं कि हैलो वर्ल्ड को बुलाया जाता है। आउटपुट हालांकि टेक्स्टराइटर में कभी नहीं उतरता है। ध्यान दें कि यदि एक ही कोड कंसोल ऐप के रूप में चलाया जाता है तो सब कुछ ठीक काम करता है।

सी #:

[DllImport("native.dll")] 
    static extern void Test(); 

    StreamWriter writer; 

    public Form1() 
    { 
     InitializeComponent(); 

     writer = new StreamWriter(@"c:\output.txt"); 
     writer.AutoFlush = true; 
     System.Console.SetOut(writer); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Test(); 
    } 

और देशी हिस्सा:

__declspec(dllexport) void Test() 
{ 
    printf("Hello World"); 
} 

अद्यतन: hamishmcn नीचे डिबग के बारे में बात करना शुरू कर दिया/रिलीज बनाता है। मैंने उपरोक्त button1_click विधि में मूल कॉल हटा दिया और इसे मानक Console.WriteLine .net कॉल के साथ बदल दिया। जब मैंने डीबग मोड में संकलित और इसे चलाया तो संदेशों को आउटपुट फ़ाइल पर रीडायरेक्ट कर दिया गया। जब मैंने रिलीज मोड में स्विच किया तो कॉल को रीडायरेक्ट नहीं किया गया था। कंसोल पुनर्निर्देशन केवल डीबग मोड में काम करता प्रतीत होता है। मैं इसके आसपास कैसे पहुंचू?

+0

कोई जवाब नहीं, लेकिन यह पोस्ट http://stackoverflow.com/questions/2570001/allow-native-dll-to-output-stdout-stderr-in-c-console- एप्प्लिकेशन सुझाव देता है कि इसे ठीक काम करना चाहिए। हम्म। ऐसा लगता है जैसे stdout कहीं और पुनर्निर्देशित कर रहा है; या तो वह या यह buffered किया जा रहा है। –

+1

आप मूल पुस्तकालय को कैसे लॉन्च/अटैच कर रहे हैं? – chilltemp

+0

मैंने vs.net के माध्यम से प्रक्रिया से जुड़ा हुआ है और इसे कंसोल पर भी चलाने दिया है, और मुझे मूल stdout से कुछ भी दिखाई नहीं देता है। मैंने डीबीजीवीव की भी कोशिश की है जो मूल रूप से कुछ भी नहीं, केवल मेरे .net संदेशों को आउटपुट करता है। –

उत्तर

1

कंसोल पुनर्निर्देशन केवल डिबग मोड में काम करता है।

1

मेरे पास वर्तमान में कोई प्रोजेक्ट नहीं है जिसे मैं कोशिश कर सकता हूं लेकिन मुझे निश्चित रूप से बफरिंग पर संदेह होगा। stdout बफर किया गया है अगर मेरी याददाश्त सही है। यह हर बार यह पंक्ति के अंत हिट बफ़र flushes:

printf("Should be flushed immediatelly\n"); 

या आप fflush उपयोग कर सकते हैं फ्लश करने के लिए stdout:

printf("Will be buffered and then flushed"); 
fflush(stdout); 

तुम भी setbuf का उपयोग करके बंद बफरिंग कर सकते हैं:

setbuf(stdout, NULL); 
+1

मैंने अभी आपके सुझावों की कोशिश की लेकिन बिना किसी किस्मत के :( –

2

शायद आपकी मूल पुस्तकालय, किसी कारण से, कंसोल के बारे में नहीं जानता है।
आप GetConsole पर कॉल करने का प्रयास कर सकते हैं यह देखने के लिए कि कोई हैंडल वापस आ गया है या नहीं। यदि नहीं, तो यह देखने के लिए कि क्या यह काम करता है, आप अपने console आवंटित करने का प्रयास कर सकते हैं।
शुभकामनाएं! :-)


अद्यतन:
मैं एक नमूना अनुप्रयोग भी (कंसोल सी # अनुप्रयोग देशी सी बुला ++ dll) और दोनों सी # Console.WriteLine और देशी printf लिखा कंसोल पर दिखाई देते हैं ... तो क्या कर रहे हैं हम गायब हैं?
क्या आप इसे हमेशा डीबग मोड में चलाते हैं - क्या आप इसे रिलीज़ मोड में चलाने पर कंसोल विंडो देखते हैं?
अपडेट 2:
क्षमा करें, मुझे कहना चाहिए कि मैं कंसोल पर टेक्स्ट देखता हूं, लेकिन अगर मैं कंसोल आउटपुट को स्ट्रीमवाइटर पर सेट करता हूं, जैसे आपके उदाहरण में है, तो केवल WriteConsole टेक्स्ट आउटपुट फ़ाइल पर जाता है, printf रों अभी भी स्क्रीन

+1

मैंने आपके सुझावों के आधार पर अपना प्रश्न अपडेट किया। –

+0

यह भी देखें http://stackoverflow.com/questions/432832/what-is-the-different-api-functions-allocconsole-and-attachconsole-1 – abatishchev

+0

abatishchev: यह अभी तक एक और यादृच्छिक फ़ंक्शन कॉल है। मज़ेदार होने का मतलब नहीं है, लेकिन मेरे सरल प्रिंटफ़ कॉल के साथ वास्तव में क्या गलत है पहली जगह में? –

0

पर जाने के अपने खुद के printf लागू (vsnprintf के शीर्ष पर गंदा विवरण की देखभाल करने के लिए) है कि कंसोल के लिए लिखते हैं:

#include <stdarg.h> 

int printf(const char *fmt, ...) 
{ 
    char buffer[LARGESIZE]; 
    int rv; 
    va_list ap; 
    va_start(ap, fmt); 
    rv = vsnprintf(buffer, sizeof(buffer), fmt, ap); 
    va_end(ap); 

    Console.WriteLine(buffer); 

    return rv; 
} 
+0

अच्छा विचार। बस इसे 'printf() 'पर कॉल न करें (बस क्योंकि यह नहीं है)। – DevSolar

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