Перенаправление собственного dll stdout / stderr изнутри C # - PullRequest
3 голосов
/ 16 сентября 2009

Я пытаюсь перенаправить вывод стороннего 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 в конструкторе. (Я добавлю обработку ошибок и т.д. позже, конечно).

1 Ответ

3 голосов
/ 16 сентября 2009

Я решил, хотя решение (конечно) имеет очень мало общего с проблемой. DLL была скомпилирована в mingw, который, очевидно, не учитывает дескрипторы, используемые средой выполнения MSVC.

Я оставлю код и решение на случай, если кто-нибудь еще столкнется с этой проблемой.

...