6

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 行目です。(もちろん、後でエラー処理などを追加します)。

4

1 に答える 1

3

私はそれを解決しましたが、解決策は(もちろん)問題とはほとんど関係がありません。dllはmingwでコンパイルされましたが、これは明らかにMSVCランタイムで使用されるハンドルを尊重していません。

他の誰かがこの問題に遭遇した場合に備えて、コードとソリューションはそのままにしておきます。

于 2009-09-16T03:10:09.007 に答える