C#内からネイティブdll stdout / stderrをリダイレクトする
質問
C#内からstdout / stderrに出力するサードパーティのネイティブdllの出力をリダイレクトしようとしています。 stdoutとstderrの両方の出力はログファイルに記録されます。
これが私のアイデアです(2つのストリームで2倍):
- AnonymousPipeServerStream を作成しますli>
-
_outServer.SafePipeHandle.DangerousGetHandle()
を介してパイプのハンドルを取得します
- P / Invokeを使用して SetStdHandle を呼び出すそのハンドル付き
- に接続する AnonymousPipeClientStream を作成しますサーバーストリーム
-
AnonymousPipeClientStream
から読み取り、ロガーに出力するループに収まるようにスレッドを作成します。 - AnonymousPipeServerStream で定期的に
flush
を呼び出します
だから、これはすべて私のコード内でうまく機能しているようです。制御がネイティブDLLに渡されるとすぐに、すべてがstderrに戻ります!必要に応じて、ネイティブDLLをデバッグし、何が問題なのかを確認できますが、...実際にはそうではないので、ハンドルがどのように機能するかを把握するために10時間を費やす前に、誰にもアイデアがありますか?
参照用に、テストコードは http://pastebin.com/f3eda7c8 にあります。興味深いのは、コンストラクターの58〜89行目です。 (もちろん、エラー処理などを後で追加します)。
解決
私はそれを解決しましたが、解決策は(もちろん)問題とはほとんど関係ありません。 dllはmingwでコンパイルされましたが、MSVCランタイムで使用されるハンドルを尊重していないようです。
コードはそのままにします&他の誰かがこの問題に遭遇した場合の解決策。
所属していません StackOverflow