2010-04-15 16 views
13

ho un sacco di Console.WriteLines nel mio codice che posso osservare in fase di esecuzione. Comunico con una libreria nativa che ho anche scritto.con Console.SetOut in modalità di rilascio?

Mi piacerebbe inserire alcuni printf nella libreria nativa e osservarli. Non li vedo comunque in fase di esecuzione.

Ho creato una complicata app ciao mondo per dimostrare il mio problema. Quando si esegue l'app, posso eseguire il debug nella libreria nativa e vedere che viene chiamato il mondo Hello. L'output non arriva mai nel textwriter però. Notare che se lo stesso codice viene eseguito come un'app console, allora tutto funziona correttamente.

C#:

[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(); 
    } 

e la parte originaria:

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

Aggiornamento: hamishmcn seguito iniziato a parlare di debug/release build. Ho rimosso la chiamata nativa nel metodo button1_click sopra riportato e l'ho appena sostituita con una chiamata .net standard Console.WriteLine. Quando ho compilato e eseguito questo in modalità di debug, i messaggi sono stati reindirizzati al file di output. Quando sono passato alla modalità di rilascio, tuttavia, le chiamate non sono state reindirizzate. Il reindirizzamento della console sembra funzionare solo in modalità di debug. Come faccio a evitare questo?

+0

Nessuna risposta, ma questo post http://stackoverflow.com/questions/2570001/allow-native-dll-to-output-stdout-stderr-in-c-console-application suggerisce che dovrebbe funzionare correttamente. Hmm. Sembra che stdout stia reindirizzando da qualche altra parte; o quello o è stato bufferizzato. –

+1

Come si avvia/si collega alla libreria nativa? – chilltemp

+0

Sono collegato al processo tramite vs.net e lo faccio semplicemente girare sulla console, e non vedo nulla dallo stdout nativo. Ho anche provato DbgView che non emette nulla di nativo, solo i miei messaggi .net. –

risposta

1

reindirizzamento della console funziona solo in modalità debug.

1

Attualmente non ho alcun progetto su cui potrei provare, ma sicuramente sospetterei il buffering. stdout viene memorizzato nel buffer se la memoria mi serve correttamente. Svuota il buffer ogni volta che raggiunge la fine della linea:

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

Oppure è possibile utilizzare fflush per lavare il stdout:

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

È inoltre possibile attivare il buffering off utilizzando setbuf:

setbuf(stdout, NULL); 
+1

Ho appena provato i tuoi suggerimenti ma senza fortuna :( –

2

Forse la tua libreria nativa, per qualche motivo, non conosce la console.
Si potrebbe provare a chiamare GetConsole e vedere se viene restituito un handle. Altrimenti potresti provare ad allocare il tuo console per vedere se funziona.
Buona fortuna! :-)


Aggiornamento:
Ho scritto un app campione troppo (console C# app chiamando nativo C++ dll) e sia il C# Console.WriteLine e la printf nativo apparire sulla console ... Ma quali sono ci manca?
Lo si esegue sempre in modalità di debug: viene visualizzata una finestra della console se la si esegue in modalità di rilascio?
Aggiornamento 2:
Spiacente, dovrei dire che vedo il testo sulla console, ma se imposto l'output della console su un StreamWriter, come nel tuo esempio, solo il testo WriteConsole va al file di output, il printf s ancora andare alla schermata

+1

Ho aggiornato la mia domanda sulla base dei tuoi suggerimenti. –

+0

Vedi anche http://stackoverflow.com/questions/432832/what-is-the-different-between-api-functions-allocconsole-and-attachconsole-1 – abatishchev

+0

abatishchev: questa è un'altra chiamata a funzione casuale, non significa essere divertente, ma cosa c'è di veramente sbagliato con le mie semplici chiamate printf in primo luogo? –

0

Implementare il proprio printf (in cima vsnprintf per prendersi cura dei dettagli sporchi), che scrive alla console:

#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

Bella idea. Basta non chiamarlo 'printf()' (semplicemente perché non lo è). – DevSolar

Problemi correlati