Перенаправление собственной библиотеки dll stdout/stderr изнутри C#

StackOverflow https://stackoverflow.com/questions/1430213

Вопрос

Я пытаюсь перенаправить вывод сторонней собственной библиотеки 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.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top