2016-04-10 20 views
-1

Ich habe eine Konsolen-App, die andere Konsolen-Apps aufruft.C# Process.Start - Wie erzwinge WaitForExit

ich den folgenden Link für Howto bin mit: „Die angegebene ausführbare Datei ist keine gültige Anwendung für diese OS-Plattform“ https://robindotnet.wordpress.com/2010/03/21/how-to-pass-arguments-to-an-offline-clickonce-application/

ich nicht Prozess instanziieren und verwenden, die, wie ich die Fehlermeldung

Ich kann die apps mit statischen Version von Process z.

Process.Start(shortcutPath, arguments); 

oder

Process.Start(shortcutPath, arguments).WaitForExit(); 

aber ich kann nicht den Prozess zu WaitForExit bekommen - eine App aufgerufen wird, und nach einer Weile, bevor die erste App abgeschlossen, der zweite genannt wird - was ein Problem ist Es hängt von der ersten App ab.

Vorschläge, wie statische Version von Prozess bekommen für die Ausreise warten (alt. Wie Prozess zu instanziiert und in der Lage Clickonce bereitgestellt apps? Nennen)

+0

Ihre Variable heißt 'shortcutPath'. Starten Sie eine Verknüpfung ('.lnk' Datei) oder eine ausführbare Datei (' .exe' Datei)? – yaakov

+0

Wenn Sie ClickOnce-Apps bereitstellen, erhalten Sie eine Referenz, die auf den Punkt verweist, an dem MS die aktuelle Exe implementiert. Ich rufe die Appref an. Es wird etwa so aussehen: C: \ Users \ Benutzername \ AppData \ Roaming \ Microsoft \ Windows \ Startmenü \ Programme \ xxx \ xxx \ xxx.appref-ms –

+0

Ich kann gehen und diese exe's suchen und die tun normale process.start-Sache, aber jedes Mal, wenn ich die angerufenen Apps erneut ausliege, muss ich den Dateipfad in der aufrufenden App aktualisieren und die Datei erneut bereitstellen. –

Antwort

0

Ok Aufruf, nach meinem Kopf gegen eine Wand für den besten Teil eines Tages bashing, ich dies gefunden ... Start an offline ClickOnce Application and wait for Exit

Verwendet die Mutex-Option. Fick mich Microsoft, du hast etwas genommen, das früher wirklich einfach war und einen echten Pferde-Arsch daraus gemacht hat.

Ich war gerade im Begriff, meine genannten exe's zu verschrotten und ein Monster zu erschaffen - fühlte mich krank bei dem Gedanken.

0

Process.Start-Methode (String, String) hat eine Rückgabewert von System.Diagnostics.Process

die zu https://msdn.microsoft.com/en-us/library/h6ak8zt5%28v=vs.110%29.aspx entsprechend ist:

ein neues Verfahren, das mit der Prozessressource zugeordnet ist, oder null, wenn kein Prozessressource gestartet wird. Beachten Sie, dass ein neuer Prozess, der neben bereits ausgeführten Instanzen desselben Prozesses gestartet wird, unabhängig von den anderen ist. Darüber hinaus kann Start einen Prozess ungleich Null zurückgeben, dessen Eigenschaft HasExited bereits auf true festgelegt ist. In diesem Fall hat der gestartete Prozess möglicherweise eine vorhandene Instanz von sich selbst aktiviert und ist dann beendet worden.

So würde ich prüfen, ob process.HasExited wahr ist, bevor WaitForExit

var process = Process.Start(shortcutPath, arguments); 
if (process != null && process.HasExited != true) 
{ 
    process.WaitForExit(); 
} 
else 
{ 
    // Process is null or have exited 
} 
+0

Sie können WaitForExit für einen Prozess aufrufen, der bereits beendet wurde. Wenn Sie nicht könnten, würde dieser Code eine Race-Bedingung einführen. – yaakov

+0

foobar - versuchte dies. Es macht keinen Unterschied - die Verarbeitung geht einfach weiter zum nächsten Anruf. Wenn ich den Code durchtrete und versuche zu sehen, welchen Wert der Prozess hat, bekomme ich "BasePriority = 'process.BasePriority' eine Ausnahme vom Typ 'System.InvalidOperationException'". Obwohl sich der Code in einem try/catch-Block befindet, löst dies keine Ausnahme aus ... –

+0

Hinweis: Selbst wenn die Prozessvariable untersucht wird, tritt ein Fehler auf, die aufgerufene Exe läuft ohne Probs. –