UseShellExecuteBoolean mülkiyet pencereler kullanılması ile ilgilidir ShellExecutehttp vs işlevi CreateProcess fonksiyonu - Kısa cevap ise olmasıdır UseShellExecutedoğrudur ardından Processsınıf kullanacak ShellExecute, aksi takdirde kullanacak, işlevi CreateProcess.
Daha uzun cevap, ShellExecuteişlevin belirli bir programı veya dosyayı açmak için kullanılmasıdır - bu, çalıştırılacak komutu çalıştırma iletişim kutusuna yazmak ve Tamam'ı tıklatmakla hemen hemen aynıdır, bu da bunun için kullanılabileceği anlamına gelir (örneğin):
- .Html dosyalarını veya web'i, o tarayıcının ne olduğunu bilmenize gerek kalmadan varsayılan tarayıcıyı kullanarak açın,
- Word için yükleme yolunun ne olduğunu bilmenize gerek kalmadan bir word belgesini açın
- Üzerinde herhangi bir komutu çalıştırın.
PATH
Örneğin:
Process p = new Process();
p.StartInfo.UseShellExecute = true;
p.StartInfo.FileName = "www.google.co.uk";
p.Start();
Kullanımı çok kolay, çok yönlü ve güçlüdür ancak bazı dezavantajları da vardır:
Standart giriş / çıkış / hata tutamaçlarını yeniden yönlendirmek mümkün değildir
Alt süreç için güvenlik tanımlayıcılarını (veya diğer harika şeyleri) belirtmek mümkün değildir
Gerçekte neyin çalıştırılacağına dair varsayımlar yaparsanız, güvenlik açıkları ortaya çıkma potansiyeli vardır:
// 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();
CreateProcessbir süreci başlatmanın çok daha kesin bir yoludur - yolu aramaz ve çocuk sürecin standart girdisini veya çıktısını (diğer şeylerin yanı sıra) yeniden yönlendirmenize izin verir. Ancak dezavantajı, CreateProcessyukarıda verdiğim 3 örnekten hiçbirinin işe yaramayacak olmasıdır (deneyin ve görün).
Özetle, aşağıdaki UseShellExecutedurumlarda yanlış ayarlamalısınız :
- Standart girdi / çıktı / hatayı yeniden yönlendirmek istiyorsunuz (bu en yaygın nedendir)
- Çalıştırılabilir dosyanın yolunu aramak istemezsiniz (örneğin, güvenlik nedenleriyle)
Tersine UseShellExecute, bir yürütülebilir dosyanın yolunu açıkça belirtmek yerine, belgeleri, url'leri veya toplu iş dosyalarını vb. Açmak istiyorsanız doğru kalmalısınız .
processStartInfo.RedirectStandardOutput=true, bana öyle geliyor ki, standart çıktıyı yine de yaparak yeniden yönlendirebilirsinizprocess.Arguments= "cmd /c dir >c:\\crp\\a.a". Aynı şekilde bir çalıştırma iletişim kutusundan yapabilirsinizcmd /c dir>c:\crp\a.a