从 C# 中重定向本机 dll stdout/stderr
题
我正在尝试重定向第三方本机 dll 的输出,该 dll 从 C# 内输出到 stdout/stderr。stdout 和 stderr 的输出都应保存到日志文件中。
这是我的想法(两个流 x2):
- 创建一个 匿名管道服务器流
- 通过获取管道的句柄
_outServer.SafePipeHandle.DangerousGetHandle()
- 使用P/Invoke进行调用 设置标准句柄 与所述手柄
- 创建一个 匿名管道客户端流 连接到服务器流
- 创建一个线程以循环读取
AnonymousPipeClientStream
并输出到记录器。 - 定期致电
flush
于AnonymousPipeServerStream
所以这一切似乎运作良好......在我的代码中。一旦控制权传递到本机 DLL,一切都会返回到 stderr!如果需要,我可以调试本机 DLL 并查看出了什么问题,但是......我真的不想,所以在我花 10 个小时试图弄清楚如何处理工作之前,有人有任何想法吗?
作为参考,测试代码位于: http://pastebin.com/f3eda7c8. 。有趣的是构造函数中的第 58-89 行。(我将添加错误处理等。当然,稍后)。
解决方案
我解决了它,尽管解决方案(当然)与问题无关。该 dll 是在 mingw 中编译的,它显然不尊重 MSVC 运行时使用的句柄。
我将保留代码和解决方案,以防其他人遇到此问题。
不隶属于 StackOverflow