2009-09-15 119 views
3

我试图重定向输出到stdout/stderr从C#中的第三方本机dll的输出。 stdout和stderr的输出应该转到日志文件。从C#重定向原生dll标准输出/标准错误#

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

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

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

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

+0

pastebin.com上的代码似乎有一些错误。例如。在两个线程中使用char缓冲区“_buffer”... – Stiefel 2011-01-21 12:00:26

+0

@Stiefel - 哎呀,是的,它的确如此。我非常快速地把它们扔在一起,IIRC。 – 2011-01-23 14:28:09

回答

3

我解决了它,虽然解决方案(当然)与问题很少有关。该DLL在mingw编译,显然不尊重MSVC运行时使用的句柄。

我会离开代码&解决方案,以防其他人遇到此问题。

相关问题