Als ich neulich an einem privaten Projekt arbeitet, in welchem ich unter anderem Dateien vergleichen musste, stieß ich auf die integrierte "Diff"-Methode von SVN. Um den Vergleich durchzuführen, kann man SVN nach folgendem Schema aufrufen:
svn diff -r ALTE_REVISION:NEUE_REVISION DATEI
und schon erhält man eine Ausgabe der Unterschiede im diff-Format.
Um SVN aufzurufen, wollte ich in einer ASP.Net Klasse den Prozess im Hintergrund starten und einfach die Rückgabe abfangen. Leider hatte ich dabei ein kleines Problem. Der Output schien immer leer zu sein.
Als ich mich dann irgendwann nochmal daran versuchte, erhielt ich plötzlich den gewünschten Output. Direkt als ich nach Hause kam, wollte ich diesen Aufruf dann einbauen, doch wiederum schwieg die Rückgabe. Darum überlegte ich mir, wo wohl der Unterschied sein konnte. Zuerst vermutete ich, dass Vista den Output unterdrücken würde, da auf meinem Arbeitsrechner XP läuft, während mein Rechner zu Hause Vista hat. - Die Idee stellte sich aber als falsch heraus, als ich das Programm des Arbeitsrechners auf meinem Heim-PC ausführte... doch da kam ich drauf: Der Unterschied lieg im Anwendungstyp: Während ich das Projekt selbst als Webanwendung aufgesetzt habe, hatte ich das Testprojekt auf dem Arbeitsrechner als Konsolenanwendung erstellt.
Mein Code sah folgendermaßen aus:
ProcessStartInfo ps = new ProcessStartInfo("svn", "diff -r 4:6 file:///MEINE_LOKALE_DATEI");
ps.UseShellExecute = false;
ps.RedirectStandardOutput = true;
Process p = new Process();
p.StartInfo = ps;
p.Start();
p.WaitForExit();
string output = p.StandardOutput.ReadToEnd();
Der String "output" war hier bei der Webanwendung stehts leer (nicht null), während die Konsolenanwendung den richtigen Output zeigte:
Konsole:
Webanwendung:
Das Problem musste ich natürlich lösen, denn ich wollte mein Projekt nicht zu einer Desktop-Anwendung machen. Darum probierte ich ein wenig rum. Zuerst vermutete ich natürlich, dass es Probleme mit dem TrustLevel der Anwendung gab und dass Webanwendungen wesentlich restriktiver behandelt werden würden, aber jegliche Änderungen an den Sicherheitseinstellungen brachten keine Änderungen. Bis ich irgendwann im Internet einen Code-Schnipsel fand und das diesen 1:1 kopierte. Dieser funktionierte auch in der Webanwendung. Jedoch kaum hatte ich den Code wieder an meine Bedürfnisse angepasst und den "sinnlosen" Schrott rausgeworfen, klappte der Code wieder nicht. Darum bin ich dann Step-für-Step durchgegangen und habe dabei rausgefunden, woran es lag:
Die magische Standarteigenschaft der ProcessStartInfo heißt "RedirectStandardError". Kaum hatte ich die in meinem Projekt auf "true" gesetzt, klappte das einfangen:
HINWEIS:
Als ich diesen Blog-Eintrag hier schreiben wollte, hatte ich zuerst vor eine andere Anwendung als SVN zu verwenden und nahm "PING" stattdessen. Interessanterweise hatte ich plötzlich auch ohne "RedirectStandardError" eine Ausgabe in der Webanwendung:
Anscheinend ist es also auch ein wenig von der Art der Anwendung abhängig.