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