从 C# 中重定向本机 dll stdout/stderr

Rob*_*ser 6 .net c# redirect stdout pipe

我正在尝试将第三方本机 dll 的输出重定向到 C# 中的 stdout/stderr。stdout 和 stderr 的输出都应该进入日志文件。

这是我的想法(两个流的 x2):

  • 创建一个匿名PipeServerStream
  • 通过获取管道的句柄 _outServer.SafePipeHandle.DangerousGetHandle()
  • 使用 P/Invoke 调用带有所述句柄的SetStdHandle
  • 创建一个连接到服务器流的AnonymousPipeClientStream
  • 创建一个线程以循环读取AnonymousPipeClientStream并输出到记录器。
  • 定期调用flushAnonymousPipeServerStream

所以所有这些似乎都运行良好......在我的代码中。一旦控制权传递给本机 DLL,一切都会回到 stderr!如果需要,我可以调试到本机 DLL 并查看出了什么问题,但是......我真的不想,所以在我花了 10 个小时试图弄清楚句柄如何工作之前,有人有任何想法吗?

作为参考,测试代码位于:http : //pastebin.com/f3eda7c8。有趣的是构造函数中的第 58-89 行。(当然,我稍后会添加错误处理等)。

Rob*_*ser 3

我解决了它,尽管解决方案(当然)与问题无关。该 dll 是在 mingw 中编译的,它显然不尊重 MSVC 运行时使用的句柄。

我将保留代码和解决方案,以防其他人遇到此问题。