Я пытаюсь перенаправить вывод стороннего dll, который выводит в stdout / stderr из C #. Вывод как stdout, так и stderr должен идти в файл журнала.
Вот моя идея (x2 для двух потоков):
- Создать AnonymousPipeServerStream
- Получить ручку трубы через
_outServer.SafePipeHandle.DangerousGetHandle()
- Используйте P / Invoke для вызова SetStdHandle с указанным дескриптором
- Создание AnonymousPipeClientStream , подключенного к потоку сервера
- Создать поток для циклического чтения из
AnonymousPipeClientStream
и вывода в логгер.
- Периодически звоните
flush
на AnonymousPipeServerStream
Так что, похоже, все это работает хорошо ... в моем коде. Как только управление переходит к нативной DLL, все возвращается к stderr! Если нужно, я могу отладить в нативную DLL и посмотреть, что происходит не так, но ... я бы действительно предпочел, но у кого-нибудь есть идеи, прежде чем я потрачу 10 часов, пытаясь выяснить, как работают ручки?
Для справки тестовый код находится по адресу: http://pastebin.com/f3eda7c8. Интересный материал - строки 58-89 в конструкторе. (Я добавлю обработку ошибок и т.д. позже, конечно).