Redirection de la DLL native stdout / stderr depuis C #
Question
J'essaie de rediriger la sortie d'une dll native tierce qui renvoie vers stdout / stderr à partir de C #. La sortie de stdout et stderr devrait aller dans un fichier journal.
Voici mon idée (x2 pour deux flux):
- Créez un AnonymousPipeServerStream
- Obtenez le handle du tuyau via
_outServer.SafePipeHandle.DangerousGetHandle ()
- Utilisez P / Invoke pour appeler SetStdHandle avec ladite poignée
- Créez un AnonymousPipeClientStream connecté à le flux du serveur
- Créez un fil de discussion placé dans une boucle à partir de
AnonymousPipeClientStream
et exporté vers le consignateur. - Appelez régulièrement
flush
sur leAnonymousPipeServerStream
Donc tout cela semble bien fonctionner ... dans mon code. Dès que le contrôle passe à la DLL native, tout retourne à stderr! Si besoin est, je peux déboguer dans la DLL native et voir ce qui ne va pas, mais… je ne préfère vraiment pas, alors quelqu'un a-t-il une idée avant de passer 10 heures à essayer de comprendre le fonctionnement des poignées?
Pour référence, le code de test se trouve à: http://pastebin.com/f3eda7c8 . Ce qui est intéressant, ce sont les lignes 58 à 89 du constructeur. (J'ajouterai le traitement des erreurs, etc. plus tard, bien sûr).
La solution
Je l'ai résolu, bien que la solution (bien sûr) ait très peu à voir avec le problème. La dll a été compilée dans mingw, ce qui ne respecte apparemment pas les descripteurs utilisés par le runtime MSVC.
Je vais laisser le code & amp; solution au cas où quelqu'un d'autre rencontrerait ce problème.