2009-09-15 5 views
3

출력되는 타사 네이티브 dll 출력을 C#에서 stdout/stderr로 리디렉션하려고합니다. stdout 및 stderr의 출력은 모두 로그 파일로 이동해야합니다. C# 내에서 네이티브 dll stdout/stderr 리디렉션

  • 가 작성 처리 말했다과

    • AnonymousPipeServerStream
    • SetStdHandle 전화를 _outServer.SafePipeHandle.DangerousGetHandle()
    • 사용 P/호출을 통해 파이프의 핸들을 얻기 만들기 : 여기

      은 (두 스트림 X2) 내 생각 AnonymousPipeClientStream은 서버 스트림에 연결됨
    • 에서 읽는 루프에 앉아 스레드 만들기 0으로 설정하고 로거로 출력합니다.
    • 정기적 그래서 모든 일이 잘 작동하는 것 ... 내 코드에서 보이는 AnonymousPipeServerStream

    flush를 호출합니다. 제어가 네이티브 DLL로 넘어 가면 모든 것이 표준 오류로 돌아갑니다! 필요한 경우, 네이티브 DLL로 디버깅하고 잘못된 일을 볼 수는 있지만 실제로 핸들이 작동하는 방식을 파악하기 위해 10 시간을 소비하기 전에 아무도 아이디어가 없습니다.

    참고로 테스트 코드는 http://pastebin.com/f3eda7c8입니다. 흥미로운 부분은 생성자의 58-89 행입니다. (나중에 오류 처리 등을 추가 할 것입니다.)

  • +0

    코드에서 pastebin.com 몇 가지 버그가있는 것으로 보입니다. 예 : char 버퍼 "_buffer"는 두 개의 스레드에서 사용됩니다 ... – Stiefel

    +0

    @Stiefel - 예, 그렇습니다. IIRC를 꽤 빨리 던져 버렸습니다. –

    답변

    3

    해결책은 (물론) 문제와는 거의 관계가 없지만 해결책을 찾았습니다. dll은 MSVC 런타임에서 사용하는 핸들을 따르지 않는 mingw로 컴파일되었습니다.

    누구든지이 문제가 발생하면 코드 &을 해결할 것입니다.

    관련 문제