Właściwość UseShellExecuteboolean jest związana z używaniem funkcji ShellExecute w systemie Windows w porównaniu z funkcją CreateProcess - krótka odpowiedź jest taka, że jeśli UseShellExecutejest prawdziwe, Processklasa będzie korzystać z ShellExecutefunkcji, w przeciwnym razie będzie używać CreateProcess.
ShellExecuteDłuższą odpowiedzią jest to, że funkcja służy do otwierania określonego programu lub pliku - jest mniej więcej równoważna wpisaniu polecenia do wykonania w oknie dialogowym uruchamiania i kliknięciu OK, co oznacza, że można jej użyć do (na przykład):
- Otwieraj pliki .html lub strony internetowe za pomocą domyślnej przeglądarki bez konieczności znajomości tej przeglądarki,
- Otwórz dokument Word bez konieczności poznania ścieżki instalacji programu Word
- Uruchom dowolne polecenie na
PATH
Na przykład:
Process p = new Process();
p.StartInfo.UseShellExecute = true;
p.StartInfo.FileName = "www.google.co.uk";
p.Start();
Jest bardzo łatwy w użyciu, wszechstronny i potężny, jednak ma kilka wad:
Nie jest możliwe przekierowanie standardowych uchwytów wejścia / wyjścia / błędów
Prawdopodobnie nie jest możliwe określenie deskryptorów zabezpieczeń (ani innych fajnych rzeczy) dla procesu potomnego
Istnieje możliwość wprowadzenia luk w zabezpieczeniach, jeśli przyjmiesz założenia dotyczące tego, co faktycznie zostanie uruchomione:
p.StartInfo.FileName = "notepad.exe";
p.Start();
CreateProcessjest znacznie bardziej precyzyjnym sposobem uruchamiania procesu - nie przeszukuje ścieżki i pozwala na przekierowanie między innymi standardowego wejścia lub wyjścia procesu potomnego. Wadą CreateProcessjest jednak to, że żaden z 3 przykładów, które podałem powyżej, nie zadziała (spróbuj i zobacz).
Podsumowując, powinieneś ustawić UseShellExecutena false, jeśli:
- Chcesz przekierować standardowe wejście / wyjście / błąd (jest to najczęstszy powód)
- Nie chcesz przeszukiwać ścieżki do pliku wykonywalnego (np. Ze względów bezpieczeństwa)
I odwrotnie, powinieneś zachować UseShellExecuteprawdę, jeśli chcesz otwierać dokumenty, adresy URL lub pliki wsadowe itp., Zamiast jawnie podawać ścieżkę do pliku wykonywalnego.
processStartInfo.RedirectStandardOutput=true, wydaje mi się, że nadal możesz przekierować standardowe wyjście, wykonującprocess.Arguments= "cmd /c dir >c:\\crp\\a.a". Podobnie z okna dialogowego uruchamiania, które możesz zrobićcmd /c dir>c:\crp\a.a