6

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

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

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

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

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

4

1 回答 1

3

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

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

于 2009-09-16T03:10:09.007 回答