Reindirizzamento dd nativo stdout / stderr da C #
Domanda
Sto cercando di reindirizzare l'output di una dll nativa di terze parti che esegue l'output su stdout / stderr da C #. L'output di entrambi stdout e stderr dovrebbe andare in un file di registro.
Ecco la mia idea (x2 per due stream):
- Crea un AnonymousPipeServerStream
- Ottieni l'handle del pipe tramite
_outServer.SafePipeHandle.DangerousGetHandle()
- Usa P / Invoca per chiamare SetStdHandle con detta maniglia
- Crea un AnonymousPipeClientStream collegato a il flusso del server
- Crea un thread per sederti in un ciclo leggendo dal
AnonymousPipeClientStream
e inviando al logger. - Chiama periodicamente
flush
suAnonymousPipeServerStream
Quindi tutto questo sembra funzionare bene ... nel mio codice. Non appena il controllo passa alla DLL nativa, tutto torna a stderr! Se necessario, posso eseguire il debug nella DLL nativa e vedere cosa non va, ma ... Preferirei davvero di no, quindi qualcuno ha qualche idea prima di passare 10 ore a cercare di capire come funzionano gli handle?
Per riferimento, il codice del test è disponibile all'indirizzo: http://pastebin.com/f3eda7c8 . Le cose interessanti sono le righe 58-89 nel costruttore. (Aggiungerò la gestione degli errori, ecc. Più avanti, ovviamente).
Soluzione
L'ho risolto, anche se la soluzione (ovviamente) ha ben poco a che fare con il problema. La dll è stata compilata in mingw, che apparentemente non rispetta gli handle utilizzati dal runtime di MSVC.
Lascio il codice & amp; soluzione nel caso in cui altri incontrino questo problema.