2015-07-27 4 views
8

У меня есть файл .exe, который необходимо запустить после создания файла. Файл успешно создан, и я использую следующий код для запуска файла .exe после этого:Process.Start() не запускает .exe-файл (работает при запуске вручную)

ProcessStartInfo processInfo = new ProcessStartInfo(); 
processInfo.FileName = pathToMyExe; 
processInfo.ErrorDialog = true; 
processInfo.UseShellExecute = false; 
processInfo.RedirectStandardOutput = true; 
processInfo.RedirectStandardError = true;       
Process proc = Process.Start(processInfo); 

Я также попытался с помощью простого Process.Start(pathToMyExe);, но файл .exe не запускается. Когда я попробую pathToMyExe вручную на моем Проводнике Windows программа правильно запущена. Но не через программу. Я вижу, что курсор поворачивается к ожиданию нескольких секунд, а затем возвращается к норме. Таким образом, Исключения не выбрасываются. Что блокирует файл?

+8

Мои психические силы говорят мне, что вы должны установить 'WorkingDirectory'. – Luaan

+1

Ты * уверен * он не работает? Вы перенаправили стандартный вывод, но вы не опубликовали код, связанный с обработкой перенаправленного вывода. Поэтому вы не увидите никакого выхода, если не будете обрабатывать его специально. Я предполагаю, что это приложение консоли. –

+1

@ Luaan, вы правы. Вы можете опубликовать его в качестве ответа. – Disasterkid

ответ

15

Вы не устанавливаете путь к рабочему каталогу и, в отличие от запуска приложения через проводник, он не устанавливается автоматически в местоположение исполняемого файла.

Просто сделать что-то вроде этого:

processInfo.WorkingDirectory = Path.GetDirectoryName(pathToMyExe); 

(предполагая, что входные файлы, библиотеки DLL и т.д. в этом каталоге)

+0

Миллион благодаря вам Luaan. –

0

Благодаря различной рабочей директории, вы должны настроить свой рабочий каталог правильно путь, по которому вы хотите начать свой процесс.

Образец демонстрацией этого может быть:

Process process = new Process() 
{ 
    StartInfo = new ProcessStartInfo(path, "{Arguments If Needed}") 
    { 
     WindowStyle = ProcessWindowStyle.Normal, 
     WorkingDirectory = Path.GetDirectoryName(path) 
    } 
}; 

process.Start(); 
1
private void Print(string pdfFileName) 
    { 
     string processFilename = Microsoft.Win32.Registry.LocalMachine 
    .OpenSubKey("Software") 
    .OpenSubKey("Microsoft") 
    .OpenSubKey("Windows") 
    .OpenSubKey("CurrentVersion") 
    .OpenSubKey("App Paths") 
    .OpenSubKey("AcroRd32.exe") 
    .GetValue(string.Empty).ToString(); 

     ProcessStartInfo info = new ProcessStartInfo(); 
     info.Verb = "print"; 
     info.FileName = processFilename; 
     info.Arguments = string.Format("/p /h {0}", pdfFileName); 
     info.CreateNoWindow = true; 
     info.WindowStyle = ProcessWindowStyle.Hidden; 
     ////(It won't be hidden anyway... thanks Adobe!) 
     info.UseShellExecute = false; 

     Process p = Process.Start(info); 
     p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 

     int counter = 0; 
     while (!p.HasExited) 
     { 
      System.Threading.Thread.Sleep(1000); 
      counter += 1; 

      if (counter == 5) 
      { 
       break; 
      } 
     } 

     if (!p.HasExited) 
     { 
      p.CloseMainWindow(); 
      p.Kill(); 
     } 
    }