2010-08-08 2 views
15

Я знаю, как запустить внешнее приложение на C# System.Diagnostics.Process.Start(executableName);, но что делать, если приложение, которое я хочу запустить, имеет расширение, которое не распознается Windows как расширение исполняемого файла. В моем случае это application.bin.Запуск внешнего приложения без расширения .exe

ответ

28

Ключ установить Process.StartInfo.UseShellExecute свойство false до начала процесса, например:

System.Diagnostics.Process p = new System.Diagnostics.Process(); 
p.StartInfo.FileName = @"c:\tmp\test.bin"; 
p.StartInfo.UseShellExecute = false; 
p.Start(); 

Это запустит процесс непосредственно: вместо того, чтобы идти через «давайте попробуем выяснить, исполняемый файл для указанный расширение файла "shell logic, файл будет считаться исполняемым.

Другой синтаксис, чтобы достичь того же результата может быть:

var processStartInfo = new ProcessStartInfo 
{ 
    FileName = @"c:\tmp\test.bin", 
    UseShellExecute = false 
}; 
Process.Start(processStartInfo); 
+1

хорошо объяснение :-) – Chad

0

Чтобы следовать на вход MDB: данная работает только если вы полностью определить путь к файлу. Если вы оставите это, чтобы Windows могла искать переменную среды PATH для файла, она добавит «.exe» для каждой папки, которую он ищет.

К сожалению, это больно для проекта, над которым я работаю, потому что местоположение полностью зависит от PATH, как установлено в пользовательском файле. Мне нужно будет найти файл вручную и установить свойство StartInfo.FileName на полный путь.

+0

Ах ... Оказывается, есть немного старый DOS трюк вы можете вы для этого добавить один период в конце имени файла и Windows, будет искать файл без расширение. Установите StartInfo.FileName = "[appname]." и это не позволит добавить «.exe» в конце. – Yelnic

2

И следовать дальше с @yelnic. Попробуйте использовать cmd.exe /C myapp, я нашел его весьма полезным, когда хочу немного больше из 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(); 
} 
Смежные вопросы