12

Wenn ich VSTS-Debugger verwenden, um die Eigenschaften der Instanz der Klasse Process anzuzeigen, sind viele der Eigenschaften mit InvalidOperationException gekennzeichnet. Warum? Mache ich etwas falsch?Ungültige Vorgangsausnahme von C# Prozessklasse

Ich verwende VSTS 2008 + C# + .Net 2.0, um eine Konsolenanwendung zu entwickeln.

Hier ist mein Code:

System.Diagnostics.Process myProcess = new System.Diagnostics.Process(); 
myProcess.StartInfo.FileName = "IExplore.exe"; 
myProcess.StartInfo.Arguments = @"www.google.com"; 
myProcess.StartInfo.Verb = "runas"; 
myProcess.Start(); 

Und ein Screenshot des Debuggers:

http://i26.tinypic.com/bdldvm.jpg http://i26.tinypic.com/bdldvm.jpg

+1

Bitte laden Sie die Details der Ausnahmebedingung hoch. –

+0

Danke, Chansik, detaillierte Ausnahmemeldung (Exception.Message) ist "Kein Prozess ist mit diesem Objekt verbunden." Ich habe getestet, nachdem der Prozess gestartet wurde, die Werte werden gültig. Ich bin verwirrt, warum vor Prozessbeginn die Werte als InvalidOperationException angezeigt werden? Es ist für welchen Zweck (warum nicht einen Standardwert anzuzeigen)? – George2

Antwort

28

Haben Sie den Prozess tatsächlich gestartet, wenn die Debugger Bild aufgenommen wurde? Das ist der Screenshot, den ich erwarten würde, bevor die Start() Methode aufgerufen wird.

Beachten Sie, dass das allgemeine Muster darin besteht, ein ProcessStartInfo zu erstellen, es aufzufüllen und dann die statische Process.Start(startInfo)-Methode aufzurufen. Das macht es konzeptionell einfacher: Sie sehen das Objekt Process erst, wenn es gestartet wurde.

+0

Danke Jon, ich habe nach dem Start des Prozesses getestet, die Werte werden gültig. Ich bin verwirrt, warum vor Prozessbeginn die Werte als InvalidOperationException angezeigt werden? Es ist für welchen Zweck (warum nicht einen Standardwert anzuzeigen)? – George2

+1

Weil der Getter eine Ausnahme auslöst. Es macht Sinn, wenn Sie darüber nachdenken; Diese Eigenschaften sind erst gültig, wenn der Prozess gestartet oder beendet wurde. –

+4

Sie sollten definitiv * nicht * Standardwerte zurückgeben. Wenn dies der Fall ist, könnte man annehmen, dass diese Werte von einem tatsächlichen Prozess korrekt zurückgegeben wurden. Was Sie tun, ist das Äquivalent von NULL-Referenz für seine Länge als eine Zeichenfolge zu stellen ... es hat keine, es ist keine Zeichenfolge! Genauso haben Sie * keinen * Prozess, um nach der Handle-Anzahl zu fragen. Die Ausnahme besagt, dass Sie * etwas falsch machen *: nämlich das Holen von Eigenschaften, bevor Sie den Prozess starten.Das kann nie eine nützliche Sache sein, und die Ausnahme ist ein viel besserer Indikator dafür als die Standardwerte. –

4

Die meisten Eigenschaften werden verfügbar, nachdem der IExplore-Prozess gestartet wurde.

+0

Also, Sie denken, dass es erwartet wird? – George2

+0

Hallo ArsenMkrt, ich habe nach dem Start des Prozesses getestet, die Werte werden gültig. Ich bin verwirrt, warum vor Prozessbeginn die Werte als InvalidOperationException angezeigt werden? Es ist für welchen Zweck (warum nicht einen Standardwert anzuzeigen)? – George2

+1

Da diese Eigenschaften vor dem Prozessstart keine Bedeutung haben, was sollte die Handler-Eigenschaft des Prozesses sein, wenn der Prozess nicht gestartet wird? Oder wie zu wissen ist, gibt es Fehler oder nicht zu Fehlereigenschaften vor Prozessbeginn zu füllen? –

1

Ja, dies ist das erwartete Verhalten und es ist auch in MSDN eindeutig dokumentiert.

Zum Beispiel kann die Process.BasePriority-Eigenschaft eine InvalidOperationException-Ausnahme auslösen, wenn der Prozess beendet wurde oder der Prozess nicht gestartet wurde (weitere Details in MSDN).

+0

Dank Chansik, Ihre Antwort macht Sinn! – George2

1

Viele der Eigenschaften sind mit InvalidOperationException markiert, bis Sie den Prozess starten. Das Objekt 'myProcess' ist keinem laufenden Prozess zugeordnet und kann daher die Informationen nicht abrufen.

versuchen, diese Aussagen hinzufügen, nachdem der Code den Prozess

if (myProcess != null) 
{ 
    myProcess.WaitForExit(); 
    //or any other statements for that matter 
} 

Jetzt zu beginnen, wenn Sie in der if-Anweisung sind, wird der VSTS-Debugger können die meisten Eigenschaften mit dem Objekt myProcess assoziiert zeigen, . Dies geschieht, weil das myProcess-Objekt jetzt einem laufenden Prozess "IExplore.exe" zugeordnet ist.

+0

Cool, danke Pradeepneo! – George2

Verwandte Themen