2016-06-11 5 views
2

Приложение winforms (not clickonce) принимает аргументы командной строки, которые должны обрабатываться только один раз. Приложение использует Application.Restart() для перезапуска после определенных изменений в его конфигурации.Изменение аргументов командной строки перед Application.Restart()

Согласно MSDN on Application.Restart()

Если ваше приложение изначально поставлялась параметры командной строки, когда он первым выполняется, перезагрузка будет запустить приложение снова с теми же параметрами.

Что вызывает обработку аргументов командной строки более одного раза.

Есть ли способ изменить (сохраненные) аргументы командной строки перед вызовом Application.Restart()?

+1

Я не эксперт winforms C#, но как насчет запуска приложения без 'Application.Restart()'? Попробуйте использовать что-то вроде 'System.Diagnostics.Process.Start (« yourapp.exe »);', и после его запуска вы просто убьете свой текущий процесс (тот, который принял аргументы). – Alisson

+2

Несомненно, следуя тому, как работает 'Application.Restart', он более надежен. Сначала он вызывает частный статический метод' ExitInternal' класса 'Application', а затем запускает процесс. –

+0

@RezaAghaei это важное различие для приложений, которые, как и мои, используют ресурсы, которые не могут пересекаться между двумя процессами и должны быть полностью удалены в первую очередь. – khargoosh

ответ

2

Вы можете перезапустить приложение без аргументов оригинальных командной строки, используя такой метод:

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

Кроме того, если вам нужно изменить параметры командной строки, его достаточно, чтобы найти аргументы командной строки, используя Environment.GetCommandLineArgs метод и создать новую командную строку строку аргумента и передать его Arguments property startInfo. Первым элементом массива, который возвращает GetCommandLineArgs, является исполняемый путь приложения, поэтому мы пренебрегаем им. Ниже пример, удаляет параметр /x из исходной командной строки, если в наличии:

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

Для получения дополнительной информации о том, как Application.Restart работает, посмотрите на Application.Restartsource code.