The UseShellExecuteproperti boolean berkaitan dengan penggunaan jendela ShellExecute fungsi vs CreateProcess fungsi - jawaban singkat adalah bahwa jika UseShellExecutebenar maka Processkelas akan menggunakan ShellExecutefungsi, selain itu akan digunakan CreateProcess.
Jawaban yang lebih panjang adalah bahwa ShellExecutefungsi tersebut digunakan untuk membuka program atau file yang ditentukan - kira-kira sama dengan mengetikkan perintah yang akan dieksekusi ke dalam dialog run dan mengklik OK, yang berarti bahwa itu dapat digunakan untuk (misalnya):
- Buka file .html atau web menggunakan browser default tanpa perlu tahu apa itu browser,
- Buka dokumen kata tanpa perlu tahu apa jalur instalasi untuk Word
- Jalankan perintah apa pun di
PATH
Sebagai contoh:
Process p = new Process();
p.StartInfo.UseShellExecute = true;
p.StartInfo.FileName = "www.google.co.uk";
p.Start();
Sangat mudah digunakan, serbaguna dan kuat namun dilengkapi dengan beberapa kelemahan:
Tidak mungkin untuk mengarahkan ulang pegangan input / output / kesalahan standar
Tidak mungkin untuk menentukan penjelas keamanan (atau hal keren lainnya) untuk proses anak
Ada potensi untuk memperkenalkan kerentanan keamanan jika Anda membuat asumsi tentang apa yang sebenarnya akan dijalankan:
// If there is an executable called "notepad.exe" somewhere on the path
// then this might not do what we expect
p.StartInfo.FileName = "notepad.exe";
p.Start();
CreateProcessadalah cara yang jauh lebih tepat untuk memulai suatu proses - itu tidak mencari jalan dan memungkinkan Anda untuk mengarahkan input atau output standar dari proses anak (antara lain). Namun kelemahannya CreateProcessadalah bahwa tidak satu pun dari 3 contoh yang saya berikan di atas akan berfungsi (coba dan lihat).
Singkatnya, Anda harus mengatur UseShellExecuteke false jika:
- Anda ingin mengarahkan input / output / kesalahan standar (ini adalah alasan paling umum)
- Anda tidak ingin mencari jalur yang dapat dieksekusi (mis. Karena alasan keamanan)
Sebaliknya, Anda harus tetap UseShellExecutebenar jika Anda ingin membuka dokumen, url atau file batch dll ... daripada harus secara eksplisit memberikan path ke file executable.
processStartInfo.RedirectStandardOutput=true, menurut saya Anda masih dapat mengarahkan output standar dengan melakukanprocess.Arguments= "cmd /c dir >c:\\crp\\a.a". Demikian juga dari kotak dialog run yang dapat Anda lakukancmd /c dir>c:\crp\a.a