2011-03-10 35 views
91
// 
    // 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; } 

如果我們產生一個新的進程,我們什麼時候需要將UseShellExecute設置爲True?我們何時需要將UseShellExecute設置爲True?

回答

132

UseShellExecute布爾屬性是關係到使用的Windows ShellExecute功能VS的CreateProcess功能 - 簡單的答案是,如果UseShellExecute爲真,那麼Process類將使用ShellExecute功能,否則將使用CreateProcess

較長的答案是ShellExecute函數用於打開指定的程序或文件 - 這大致等同於鍵入要在運行對話框中執行的命令並單擊確定,這意味着它可用於(例如):

  • 打開。HTML文件或使用默認的瀏覽器,而無需知道瀏覽器是什麼網站,
  • 打開,而不需要知道什麼Word中的安裝路徑是
  • 運行批處理文件
  • 運行在PATH任何命令的Word文檔

例如:

這是非常簡單易用,靈活和強大但是帶有一些缺點:

  • 這是不可能的重定向標準輸入/輸出/錯誤處理
  • 這是不可能爲子進程
  • 指定的安全描述符(或其他很酷的事情)有潛在介紹的安全漏洞,如果你做出什麼樣的假設將實際運行:

    // 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(); 
    

CreateProcess是開始的一個更爲精確的方法一個進程 - 它不搜索路徑並允許您重定向子進程的標準輸入或輸出(等等)。然而,CreateProcess的缺點是,我上面給出的4個例子都不起作用(試一試看)。

總之,你應該設置UseShellExecute爲false,如果:

  • 你要重定向標準輸入/輸出/錯誤(這是最常見的原因)
  • 你不想搜索爲可執行文件的路徑(例如出於安全原因)

反之,如果你要打開的文件,URL或批處理文件等,你應該保持UseShellExecute真的......而不必明確給出路徑的可執行文件。

+1

偉大的東西,但是你寫的(有ShellExecute的),「它[你要求]無法重定向標準輸入/輸出/錯誤句柄「< - 肯定是不正確或不準確。即使useShellExecute設置爲true,雖然確實不能執行'processStartInfo.RedirectStandardOutput = true',但在我看來,仍然可以通過執行'process.Arguments =「cmd/c dir> c:\\ crp來重定向標準輸出\\ AA「'。同樣,從運行對話框中,你也可以執行'cmd/c dir> c:\ crp \ aa' – barlop 2016-04-24 22:51:58

+3

,你說'UseShellExecute = false'即CreateProcess時,不會檢查路徑,但是即使在我做「UseShellExecute = false」,即假設沒有檢查路徑,然後process.FileName =「cmd.exe」的作品,所以它檢查c:\ windows \ system32。如果我將cmd.exe複製到c:\ windows並將其命名爲cmmmd.exe,那麼我會執行process1.FileName =「cmmmd.exe」,它可以檢查c:\ windows,因此它似乎正在檢查路徑,或者一些目錄。 – barlop 2016-04-24 23:29:27

+0

MSDN文檔同意@barlop:「當UseShellExecute爲false時,FileName屬性可以是可執行文件的完全限定路徑,也可以是系統嘗試在PATH環境變量指定的文件夾中查找的簡單可執行文件名稱。」 – Bob 2016-08-18 12:05:02

9

MSDN

此屬性設置爲false使 你重定向輸入,輸出和 錯誤流。如果 UserName屬性不爲空或 空字符串,或者當 的Process.Start(的ProcessStartInfo)方法 被稱爲 出現InvalidOperationException將 拋出

UseShellExecute一定是假的。

當您使用的操作系統 shell來啓動進程,你可以 啓動任何文件(這與 具有默認打開 行動可執行關聯的任何 已註冊的文件類型),並在 文件執行操作如 流程組件打印。當 UseShellExecute爲false時,您可以使用 流程組件僅啓動可執行文件 。

如果您的 將ErrorDialog屬性設置爲true,則UseShellExecute必須爲真。

11

我認爲主要是針對非可執行文件。例如,如果試圖打開一個.html文件,如果您必須將UseShellExecute設置爲true,並且這將在用戶默認設置的瀏覽器中打開.html文件。

0

如果我們想隱藏當前應用程序的可執行窗口,然後UseShellExecute應設置爲true

相關問題