Я понимаю, что это 7 лет, но я только что столкнулся с этим. Я думаю, что на самом деле вызов исполняемого файла и закрытие текущей программы - это нечто вроде клочья. Как уже говорилось ранее, это обдумывается. Я думаю, что самый чистый и модульный способ - взять все, что есть в методе Main
, и создать другой метод, скажем, Run()
, который содержит все, что было в методе Main
, а затем вызвать новый * 1004. * метод из метода Main
или в любом месте кода, который требуется перезапустить программу.
Так что, если Main
метод выглядел так:
static void Main(string[] args)
{
/*
Main Method Variable declarations;
Main Method Method calls;
Whatever else in the Main Method;
*/
int SomeNumber = 0;
string SomeString = default(string);
SomeMethodCall();
//etc.
}
Затем просто создайте метод Run()
и поместите в него все из Main
, например, так:
public static void Run()
{
//Everything that was in the Main method previously
/*
Main Method Variable declarations;
Main Method Method calls;
Whatever else in the Main Method;
*/
int SomeNumber = 0;
string SomeString = default(string);
SomeMethodCall();
//etc.
}
Теперь, когда метод Run()
создан и в нем есть все то, что было в методе Main
ранее, просто сделайте ваш метод main следующим образом:
static void Main(string[] args)
{
Run();
}
Теперь, где бы в коде вы не хотели «перезапускать» программу, просто вызовите метод Run()
следующим образом:
if(/*whatever condition is met*/)
{
//do something first
//then "re-start" the program by calling Run();
Run();
}
Итак, это упрощенный взгляд на программу:
РЕДАКТИРОВАТЬ: Когда я опубликовал это первоначально, я не принял во внимание какие-либо аргументы, которые могли быть переданы в программу. Чтобы учесть это, нужно изменить четыре вещи в моем первоначальном ответе.
объявить глобальный List<string>
как это:
public static List<string> MainMethodArgs = new List<string>();
.
В методе Main
установите значение списка MainMethodArgs
равным
значения, передаваемые в метод Main
через args
, например:
MainMethodArgs = args.ToList();
При создании метода Run()
измените сигнатуру так, чтобы она ожидала
string[]
вызывается args
для передачи ему так:
public static void Run(string[] args)
{
....
}
Везде, где в программе вызывается метод Run()
, передайте MainMethodArgs
до Run()
вот так:
Run(MainMethodArgs.ToArray());
Я изменил приведенный ниже пример, чтобы отразить эти изменения.
using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ExampleConsole
{
class Program
{
public static List<string> MainMethodArgs = new List<string>();
static void Main(string[] args)
{
MainMethodArgs = args.ToList();
Run(MainMethodArgs.ToArray());
}
public static void Run(string[] args)
{
Console.WriteLine("Run() is starting");
Console.ReadLine();
//stuff that used to be in the public method
int MainMethodSomeNumber = 0;
string MainMethodSomeString = default(string);
SomeMethod();
//etc.
}
public static void SomeMethod()
{
Console.WriteLine("Rebuild Log Files"
+ " Press Enter to finish, or R to restar the program...");
string restar = Console.ReadLine();
if (restar.ToUpper() == "R")
{
//here the code to restart the console...
Run(MainMethodArgs.ToArray());
}
}
}
}
Фактически программа «перезапускается» без необходимости перезапуска исполняемого файла и закрытия существующего экземпляра программы. Мне это кажется гораздо более «программистским».
Наслаждайтесь.