C# 内から stdout/stderr に出力するサードパーティのネイティブ dll の出力をリダイレクトしようとしています。stdout と stderr の両方の出力がログ ファイルに出力されます。
これが私の考えです(2つのストリームの場合はx2):
- AnonymousPipeServerStreamを作成する
- 経由でパイプのハンドルを取得します
_outServer.SafePipeHandle.DangerousGetHandle()
- P/Invoke を使用して、上記のハンドルでSetStdHandleを呼び出します
- サーバー ストリームに接続されたAnonymousPipeClientStreamを作成する
AnonymousPipeClientStream
から読み取り、ロガーに出力するループに入るスレッドを作成します。- 定期的に電話
flush
するAnonymousPipeServerStream
したがって、これはすべてうまく機能しているようです...私のコード内で。コントロールがネイティブ DLL に渡されるとすぐに、すべてが stderr に戻ります! 必要に応じて、ネイティブ DLL にデバッグして、何が問題なのかを確認できますが、実際にはそうしたくないので、ハンドルがどのように機能するかを理解するのに 10 時間を費やす前に、誰かアイデアをお持ちですか?
参考までに、テスト コードはhttp://pastebin.com/f3eda7c8にあります。興味深いのは、コンストラクターの 58 ~ 89 行目です。(もちろん、後でエラー処理などを追加します)。