Các UseShellExecutetài sản boolean có liên quan đến việc sử dụng các cửa sổ ShellExecute chức năng vs các CreateProcess chức năng - câu trả lời ngắn gọn là nếu UseShellExecutelà đúng thì các Processlớp học sẽ sử dụng các ShellExecutechức năng, nếu không nó sẽ sử dụng CreateProcess.
Câu trả lời dài hơn là ShellExecutehàm được sử dụng để mở một chương trình hoặc tệp được chỉ định - nó gần như tương đương với việc gõ lệnh sẽ được thực thi trong hộp thoại chạy và nhấp vào OK, có nghĩa là nó có thể được sử dụng để (ví dụ):
- Mở tệp .html hoặc web bằng trình duyệt mặc định mà không cần biết trình duyệt đó là gì,
- Mở một tài liệu word mà không cần biết đường dẫn cài đặt cho Word là gì
- Chạy bất kỳ lệnh nào trên
PATH
Ví dụ:
Process p = new Process();
p.StartInfo.UseShellExecute = true;
p.StartInfo.FileName = "www.google.co.uk";
p.Start();
Nó rất dễ sử dụng, linh hoạt và mạnh mẽ tuy nhiên đi kèm với một số nhược điểm:
Không thể chuyển hướng xử lý đầu vào / đầu ra / lỗi tiêu chuẩn
Không thể chỉ định các mô tả bảo mật (hoặc những thứ hay ho khác) cho quy trình con
Có khả năng giới thiệu các lỗ hổng bảo mật nếu bạn đưa ra các giả định về những gì sẽ thực sự được chạy:
// 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();
CreateProcesslà một cách chính xác hơn nhiều để bắt đầu một quy trình - nó không tìm kiếm đường dẫn và cho phép bạn chuyển hướng đầu vào hoặc đầu ra tiêu chuẩn của quy trình con (trong số những thứ khác). CreateProcessTuy nhiên, nhược điểm là không có ví dụ nào trong 3 ví dụ tôi đưa ra ở trên sẽ hoạt động (hãy thử và xem).
Tóm lại, bạn nên đặt UseShellExecutethành false nếu:
- Bạn muốn chuyển hướng đầu vào / đầu ra / lỗi tiêu chuẩn (đây là lý do phổ biến nhất)
- Bạn không muốn tìm kiếm đường dẫn cho tệp thực thi (ví dụ: vì lý do bảo mật)
Ngược lại, bạn nên giữ UseShellExecuteđúng nếu bạn muốn mở tài liệu, url hoặc tệp bó, v.v ... thay vì phải cung cấp đường dẫn rõ ràng để thực thi.
processStartInfo.RedirectStandardOutput=true, đối với tôi, bạn vẫn có thể chuyển hướng đầu ra tiêu chuẩn bằng cách thực hiệnprocess.Arguments= "cmd /c dir >c:\\crp\\a.a". Tương tự như vậy từ một hộp thoại chạy bạn có thể làmcmd /c dir>c:\crp\a.a