Ich versuche, die Ausgabe eines Drittanbieters nativen dll umleiten, die Ausgaben zu stdout/stderr von innerhalb von C#. Die Ausgabe von stdout und stderr sollte in eine Protokolldatei gehen.
Hier ist meine Idee (x2 für zwei Streams):
- Erstellen einer AnonymousPipeServerStream
- Holen Sie sich den Griff des Rohrs über
_outServer.SafePipeHandle.DangerousGetHandle()
- Verwenden Sie P/Invoke zum Aufrufen von SetStdHandle mit besagtem Griff
- Erstellen einer AnonymousPipeClientStream mit dem Server-Stream verbunden
- Erstellen Sie einen Thread, der in einer Schleife aus der Datei
AnonymousPipeClientStream
und die Ausgabe an den Logger. - Regelmäßig anrufen
flush
über dieAnonymousPipeServerStream
All dies scheint also gut zu funktionieren... innerhalb meines Codes. Sobald die Kontrolle an die native DLL übergeben wird, geht alles zurück zu stderr! Wenn es nötig ist, kann ich in der nativen DLL debuggen und sehen, was falsch läuft, aber... Ich würde wirklich lieber nicht, also hat jemand eine Idee, bevor ich 10 Stunden damit verbringe, herauszufinden, wie Griffe funktionieren?
Als Referenz finden Sie den Testcode unter: http://pastebin.com/f3eda7c8 . Das Interessante sind die Zeilen 58-89 im Konstruktor. (Ich werde die Fehlerbehandlung usw. natürlich später hinzufügen).
0 Stimmen
Der Code auf pastebin.com scheint einige Fehler zu haben. Z.B. wird der Zeichenpuffer "_buffer" in zwei Threads verwendet...
0 Stimmen
@Stiefel - Ups, ja, das stimmt. Ich habe das ziemlich schnell zusammengeworfen, IIRC.