Tôi biết cách chạy ứng dụng bên ngoài trong C# System.Diagnostics.Process.Start(executableName);
nhưng nếu ứng dụng tôi muốn chạy có phần mở rộng không được Windows nhận dạng là phần mở rộng của tệp thực thi. Trong trường hợp của tôi là application.bin
.Chạy ứng dụng bên ngoài không có phần mở rộng .exe
Trả lời
Key là để thiết lập Process.StartInfo.UseShellExecute
tài sản để false
trước khi bắt đầu quá trình này, ví dụ:
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = @"c:\tmp\test.bin";
p.StartInfo.UseShellExecute = false;
p.Start();
này sẽ bắt đầu quá trình trực tiếp: thay vì đi qua "chúng ta hãy cố gắng tìm ra các thực thi cho các phần mở rộng tệp được chỉ định "shell logic, tệp sẽ được coi là có thể thực thi được.
cú pháp khác để đạt được cùng một kết quả có thể là:
var processStartInfo = new ProcessStartInfo
{
FileName = @"c:\tmp\test.bin",
UseShellExecute = false
};
Process.Start(processStartInfo);
Để thực hiện theo vào entry mdb của: đây chỉ hoạt động nếu bạn hoàn toàn đủ điều kiện đường dẫn đến tập tin. Nếu bạn để nó cho phép Windows tìm kiếm biến môi trường PATH cho tệp, nó sẽ nối thêm một ".exe" cho mỗi thư mục mà nó tìm kiếm.
Đáng buồn thay, điều này gây đau đớn cho dự án tôi đang làm việc, vì vị trí hoàn toàn phụ thuộc vào PATH như được đặt trong tệp người dùng. Tôi sẽ phải tìm tệp theo cách thủ công và đặt thuộc tính StartInfo.FileName thành đường dẫn đầy đủ.
Ah ... Hóa ra có một chút DOS lừa cũ bạn có thể bạn cho việc này: Thêm một khoảng thời gian duy nhất để kết thúc tên file và Windows sẽ tìm kiếm các tập tin mà không có một sự mở rộng. Đặt StartInfo.FileName = "[tên ứng dụng]." và nó sẽ tránh thêm ".exe" ở cuối. – Yelnic
Và theo dõi từ @yelnic. Hãy thử sử dụng cmd.exe /C myapp
, tôi thấy nó khá hữu ích khi tôi muốn nhiều hơn một chút trong số Process.Start()
.
using (Process process = Process.Start("cmd.exe")
{
// `cmd` variable can contain your executable without an `exe` extension
process.Arguments = String.Format("/C \"{0} {1}\"", cmd, String.Join(" ", args));
process.UseShellExecute = false;
process.RedirectStandardOutput = true;
process.Start();
process.WaitForExit();
output = process.StandardOutput.ReadToEnd();
}
giải thích đẹp :-) – Chad