Запуск внешнего приложения без расширения .exe

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

Ответы

Ответ 1

Ключ должен установить свойство 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();

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

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

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

Ответ 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();
}

Ответ 3

Следовать записи mdb: это ТОЛЬКО работает, если вы полностью указали путь к файлу. Если вы разрешите Windows искать переменную среды PATH для файла, она добавит ".exe" для каждой папки, которую ищет.

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