Redirecionando nativa dll stdout / stderr de dentro C #
Pergunta
Eu estou tentando redirecionar a saída de um de terceiros dll nativa que saídas para stdout / stderr de dentro C #. A saída de ambos stdout e stderr deve ir a um arquivo de log.
Aqui está a minha ideia (x2 para duas correntes):
- Criar um AnonymousPipeServerStream
- Obter alça do tubo de via
_outServer.SafePipeHandle.DangerousGetHandle()
- Use P / Invoke para chamar SetStdHandle com o referido punho
- Criar um AnonymousPipeClientStream conectado a o fluxo de servidor
- Criar um fio para se sentar em um loop leitura do
AnonymousPipeClientStream
e saída para o logger. - Periodicamente chamada
flush
naAnonymousPipeServerStream
Então, tudo isso parece estar funcionando bem ... dentro do meu código. Assim que o controle passa para a DLL nativa, tudo volta ao stderr! Se for necessário, eu posso depurar a DLL nativa e ver o que está acontecendo de errado, mas ... Eu realmente prefiro não, então alguém tem alguma idéia antes de eu passar 10 horas tentando descobrir como alças trabalho?
Para referência, o código de teste está em: http://pastebin.com/f3eda7c8 . A coisa interessante é linhas 58-89 no construtor. (Vou adicionar tratamento de erros, etc. depois, é claro).
Solução
Eu resolvi que, embora a solução (é claro) tem muito pouco a ver com o problema. A dll foi compilado em mingw, que aparentemente não respeitar as alças usados ??pelo tempo de execução MSVC.
Vou deixar o código & solução até no caso de alguém encontros else este problema.