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 na AnonymousPipeServerStream

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).

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top