2015-07-27 17 views
8

Ich habe eine .exe Datei, die ausgeführt werden muss, nachdem ich eine Datei zu erstellen. Die Datei wird erfolgreich erstellt, und ich bin mit dem folgenden Code die .exe Datei danach auszuführen:Process.Start() nicht an den Start der EXE-Datei (funktioniert, wenn sie manuell ausgeführt werden)

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

ich auch mit einer einfachen Process.Start(pathToMyExe); aber die .exe Datei wird nicht ausgeführt versucht. Wenn ich pathToMyExe manuell auf meinem Windows Explorer versuche, wird das Programm korrekt ausgeführt. Aber nicht über das Programm. Was ich sehe, ist, dass der Cursor auf ein paar Sekunden wartet und dann wieder normal wird. Daher werden auch keine Ausnahmen ausgelöst. Was blockiert die Datei?

+8

Meine psychischen Kräfte mir erzählst du die 'WorkingDirectory' einstellen müssen. – Luaan

+1

Sie * sicher * es läuft nicht? Sie haben die Standardausgabe umgeleitet, aber Sie haben keinen Code zur Verarbeitung der umgeleiteten Ausgabe gepostet. Sie sehen daher keine Ausgabe, es sei denn, Sie behandeln sie speziell. Ich gehe davon aus, dass dies eine Console App ist. –

+1

@Luaan du hast Recht. Sie können es als Antwort posten. – Disasterkid

Antwort

15

Sie setzen nicht den Arbeitsverzeichnispfad, und im Gegensatz zu, wenn die Anwendung über den Explorer startet, wird es nicht automatisch auf den Speicherort der ausführbaren gesetzt.

tun einfach etwas wie folgt aus:

processInfo.WorkingDirectory = Path.GetDirectoryName(pathToMyExe); 

(unter der Annahme, die Eingabedateien, DLLs usw. sind in diesem Verzeichnis)

+0

Millionen Dank dir Luaan. –

0

Aufgrund der unterschiedlichen Arbeitsverzeichnis, müssen Sie Ihr Arbeitsverzeichnis eingestellt richtig der Pfad, mit dem der Prozess gestartet werden soll.

Eine Probe Beweis dafür können sein:

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(); 
     } 
    }