UseShellExecute'u ne zaman True olarak ayarlamamız gerekir?


135
//
// Summary:
//     Gets or sets a value indicating whether to use the operating system shell
//     to start the process.
//
// Returns:
//     true to use the shell when starting the process; otherwise, the process is
//     created directly from the executable file. The default is true.
[DefaultValue(true)]
[MonitoringDescription("ProcessUseShellExecute")]
[NotifyParentProperty(true)]
public bool UseShellExecute { get; set; }

Yeni bir işlem başlatırsak, UseShellExecute'u ne zaman True olarak ayarlamamız gerekir?

Yanıtlar:


204

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 .


2
Harika şeyler, ancak bunu (ShellExecute ile) yazıyorsunuz, "Standart girdi / çıktı / hata tutamaçlarını yeniden yönlendirmenin mümkün olmadığını iddia ediyorsunuz" <- Elbette bu yanlış veya yanlış. UseShellExecute true olarak ayarlanmış olsa bile, gerçekten yapamazsınız processStartInfo.RedirectStandardOutput=true, bana öyle geliyor ki, standart çıktıyı yine de yaparak yeniden yönlendirebilirsiniz process.Arguments= "cmd /c dir >c:\\crp\\a.a". Aynı şekilde bir çalıştırma iletişim kutusundan yapabilirsinizcmd /c dir>c:\crp\a.a
barlop

4
ayrıca, UseShellExecute=falseyani CreateProcess'in yolu kontrol etmeyeceğini söylüyorsunuz, ancak "UseShellExecute = false" yaptığımda, yani sözde yolu kontrol etmediğimde bile process.FileName = "cmd.exe" çalıştığını görüyorum. c: \ windows \ system32 denetleniyor. Ve cmd.exe'yi c: \ windows'a kopyalayıp cmmmd.exe olarak adlandırırsam, o zaman da işe yarayan process1.FileName = "cmmmd.exe" yaparım, böylece c: \ windows'u kontrol eder, böylece yolu kontrol ediyormuş gibi görünür veya bazı dizinler.
barlop

2
MSDN belgeleri @barlop ile aynı fikirdedir: "UseShellExecute yanlış olduğunda, FileName özelliği ya yürütülebilir dosyanın tam olarak nitelenmiş bir yolu ya da sistemin PATH ortam değişkeni tarafından belirtilen klasörler içinde bulmaya çalışacağı basit bir yürütülebilir ad olabilir."
Bob

Ayarıyla UseShellExecuteiçin trueben (sadece arama sürecinde oluşturulan) bir ortam değişkeni paylaşmak başardı. Çok kullanışlı
Mitkins

14

Çoğunlukla çalıştırılamayanlar için düşünüyorum. Örneğin .html, bir dosyayı açmaya çalışıyorsanız , ayarlamanız UseShellExecutegerekiyorsa trueve bu .html, kullanıcı tarafından varsayılan olarak ayarlanmış bir tarayıcıda açılır .


12

Gönderen MSDN :

Bu özelliği false olarak ayarlamak, girdi, çıktı ve hata akışlarını yeniden yönlendirmenize olanak tanır.

UserName özelliği null değilse veya boş bir dize değilse UseShellExecute false olmalıdır veya Process.Start (ProcessStartInfo) yöntemi çağrıldığında bir InvalidOperationException atılır.

İşlemleri başlatmak için işletim sistemi kabuğunu kullandığınızda, herhangi bir belgeyi başlatabilir (bu, varsayılan açık eylemi olan bir yürütülebilir dosya ile ilişkili herhangi bir kayıtlı dosya türüdür) ve Process bileşeniyle yazdırma gibi dosya üzerinde işlemler gerçekleştirebilirsiniz. UseShellExecute false olduğunda, yalnızca Process bileşeniyle yürütülebilir dosyaları başlatabilirsiniz.

ErrorDialog özelliğini true olarak ayarlarsanız UseShellExecute true olmalıdır.


0

Mevcut Uygulama yürütülebilir penceresini gizlemek istiyorsak, UseShellExecute true olarak ayarlanmalıdır.


0

Yol bir boşluk veya başka bazı özel (aksanlı) karakterler içerdiğinde, CreateProcess (UseShellExecute = false) kısa dosya adları ("DOS" 8.3 gösterimi) kullanıyor gibi görünür, ShellExecute (UseShellExecute = true) uzun dosya adları kullanır. Bu nedenle, UseShellExecute = false kullandığınızda, dizin ve dosya adlarınızı 8.3 adlara dönüştürdüğünüzden emin olun (google ".net, 8.3 dosya adı nasıl alınır"). (Hangi Windows sürümlerinin ve / veya dosya sistemlerinin bu şekilde yaptığından tam olarak emin değil, Windows 7, NTFS üzerinde test edildi.)


Uzayda sadece yolu kesiyor olabilir mi? "Yol / program adı" nın başına tırnak işareti koymak bu sorunu çözer.
gbarry
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.