2016-06-11 2 views
2

Mon application winforms (not clickonce) prend des arguments de ligne de commande qui ne doivent être traités qu'une seule fois. L'application utilise Application.Restart() pour se redémarrer après des modifications spécifiques à sa configuration.Modifier les arguments de ligne de commande avant Application.Restart()

Selon MSDN on Application.Restart()

Si votre application a été initialement fourni des options de ligne de commande lors de son exécution, le redémarrage de lancer l'application à nouveau avec les mêmes options.

Ce qui provoque le traitement des arguments de ligne de commande plusieurs fois.

Existe-t-il un moyen de modifier les arguments de ligne de commande (stockés) avant d'appeler Application.Restart()?

+1

Je ne suis pas expert en la matière, mais qu'en est-il du lancement de l'application sans le 'Application.Restart()'? Essayez d'utiliser quelque chose comme 'System.Diagnostics.Process.Start (" yourapp.exe ");', et après le démarrage, vous venez de tuer votre processus en cours (celui qui a pris des arguments). – Alisson

+2

Sûrement en suivant le fonctionnement de 'Application.Restart', c'est plus fiable. Il appelle d'abord la méthode statique' ExitInternal' de la classe 'Application' et commence le processus. –

+0

@RezaAghaei C'est une distinction importante pour les applications qui, comme la mienne, utilisent des ressources qui ne peuvent pas se chevaucher entre les deux processus et doivent être entièrement éliminées en premier. – khargoosh

Répondre

2

Vous pouvez redémarrer votre application sans arguments de ligne de commande d'origine en utilisant cette méthode:

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

Aussi, si vous avez besoin de modifier les arguments de ligne de commande, son assez pour trouver des arguments de ligne de commande en utilisant la méthode Environment.GetCommandLineArgs et de créer la nouvelle ligne de commande argument chaîne et passez-le à Arguments propriété de startInfo. Le premier élément du tableau qui renvoie GetCommandLineArgs est le chemin d'exécution de l'application, donc nous le négligeons. L'exemple ci-dessous, supprime un paramètre /x de la ligne de commande d'origine si possible:

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

Pour plus d'informations sur la façon dont Application.Restart œuvres, jetez un oeil à Application.Restartsource code.