Pregunta

Estoy intentando redirigir la salida de un dll nativo de terceros que sale a stdout / stderr desde C #. La salida de stdout y stderr debe ir a un archivo de registro.

Aquí está mi idea (x2 para dos transmisiones):

  • Cree un AnonymousPipeServerStream
  • Obtenga el mango de la tubería a través de _outServer.SafePipeHandle.DangerousGetHandle()
  • Use P / Invoke para llamar a SetStdHandle con dicho asa
  • Cree un AnonymousPipeClientStream conectado a la secuencia del servidor
  • Cree un hilo para sentarse en un bucle leyendo desde el AnonymousPipeClientStream y enviando al registrador.
  • Llame periódicamente a flush en AnonymousPipeServerStream

Entonces, todo esto parece estar funcionando bien ... dentro de mi código. ¡Tan pronto como el control pase a la DLL nativa, todo volverá a stderr! Si es necesario, puedo depurar en la DLL nativa y ver qué está mal, pero ... Realmente prefiero no hacerlo, ¿alguien tiene alguna idea antes de pasar 10 horas tratando de descubrir cómo funcionan los controladores?

Como referencia, el código de prueba se encuentra en: http://pastebin.com/f3eda7c8 . Lo interesante son las líneas 58-89 en el constructor. (Agregaré manejo de errores, etc. más tarde, por supuesto).

¿Fue útil?

Solución

Lo resolví, aunque la solución (por supuesto) tiene muy poco que ver con el problema. El dll se compiló en mingw, que aparentemente no respeta los identificadores utilizados por el tiempo de ejecución de MSVC.

Dejaré el código & amp; solución en caso de que alguien más se encuentre con este problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top