2016-06-11 7 views
2

Meine winforms (nicht clickonce) -Anwendung nimmt Befehlszeilenargumente, die nur einmal verarbeitet werden sollten. Die Anwendung verwendet Application.Restart(), um sich nach bestimmten Änderungen an ihrer Konfiguration neu zu starten.Ändern der Befehlszeilenargumente vor Application.Restart()

Nach MSDN on Application.Restart()

Wenn die Anwendung ursprünglich Befehlszeilenoptionen geliefert, wenn es mit den gleichen Optionen zuerst ausgeführt wird Neustart erneut die Anwendung starten.

Das bewirkt, dass die Befehlszeilenargumente mehr als einmal verarbeitet werden.

Gibt es eine Möglichkeit, die (gespeicherten) Befehlszeilenargumente vor dem Aufruf Application.Restart() zu ändern?

+1

Ich bin nicht C# winforms Experte, aber was ist mit dem Starten der Anwendung ohne die 'Application.Restart()'? Versuchen Sie etwas wie 'System.Diagnostics.Process.Start (" yourapp.exe ");' zu verwenden, und nachdem Sie es gestartet haben, beenden Sie einfach Ihren aktuellen Prozess (den, der Argumente benötigte). – Alisson

+2

Sicherlich folgt die Art, wie 'Application.Restart' funktioniert, zuverlässiger. Es ruft zuerst die private statische' ExitInternal'-Methode der 'Application'-Klasse auf und startet dann den Prozess. –

+0

@RezaAghaei Dies ist eine wichtige Unterscheidung für Anwendungen, die, wie meine, Ressourcen verwenden, die sich nicht überschneiden können und erst vollständig beseitigt werden müssen. – khargoosh

Antwort

2

Sie Ihre Anwendung ohne ursprünglichen Befehlszeilenargumente unter Verwendung eines solchen Verfahrens neu starten können:

// using System.Diagnostics; 
// using System.Windows.Forms; 

public static void Restart() 
{ 
    ProcessStartInfo startInfo = Process.GetCurrentProcess().StartInfo; 
    startInfo.FileName = Application.ExecutablePath; 
    var exit = typeof(Application).GetMethod("ExitInternal", 
         System.Reflection.BindingFlags.NonPublic | 
         System.Reflection.BindingFlags.Static); 
    exit.Invoke(null, null); 
    Process.Start(startInfo); 
} 

Auch wenn Sie Befehlszeilenargumente ändern müssen, seine genug Befehlszeilenargumente mit Environment.GetCommandLineArgs Methode zu finden und neue Befehlszeile erstellen Argument String und übergeben Sie es an Arguments Eigentum von startInfo. Das erste Element des Arrays, das GetCommandLineArgs zurückgibt, ist der ausführbare Pfad der Anwendung, also vernachlässigen wir es. Das folgende Beispiel entfernt einen Parameter /x von den ursprünglichen Befehlszeile falls vorhanden:

var args = Environment.GetCommandLineArgs().Skip(1); 
var newArgs = string.Join(" ", args.Where(x => x != @"/x").Select(x => @"""" + x + @"""")); 
startInfo.Arguments = newArgs; 

Weitere Informationen darüber, wie Application.Restart Arbeiten, bei Application.Restartsource code einen Blick darauf werfen.