我正在尝试重定向第三方本机 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 行。(当然,稍后我会添加错误处理等)。