Как перезапустить консольное приложение? - PullRequest
10 голосов
/ 18 апреля 2011

Мне нужно перезапустить консоль приложения, когда пользователь нажимает «R».

У меня есть

Console.WriteLine(message, "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...
}

спасибо

Ответы [ 9 ]

12 голосов
/ 18 апреля 2011
// Starts a new instance of the program itself
System.Diagnostics.Process.Start(Application.ExecutablePath);

// Closes the current process
Environment.Exit(0);
8 голосов
/ 25 ноября 2011
static void Main(string[] args)
{
    var info = Console.ReadKey();
    if (info.Key == ConsoleKey.R)
    {
        var fileName = Assembly.GetExecutingAssembly().Location;
        System.Diagnostics.Process.Start(fileName);
    }
}
5 голосов
/ 18 апреля 2011

Я не думаю, что вам действительно нужно перезапустить все приложение. Просто запустите требуемый метод (ы) после нажатия R. Не нужно перезапускать.

2 голосов
/ 07 июня 2018

Еще один простой способ

//Start process, friendly name is something like MyApp.exe (from current bin directory)
System.Diagnostics.Process.Start(System.AppDomain.CurrentDomain.FriendlyName);

//Close the current process
Environment.Exit(0);
1 голос
/ 13 декабря 2018

Я понимаю, что это 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();
}

Итак, это упрощенный взгляд на программу:

РЕДАКТИРОВАТЬ: Когда я опубликовал это первоначально, я не принял во внимание какие-либо аргументы, которые могли быть переданы в программу. Чтобы учесть это, нужно изменить четыре вещи в моем первоначальном ответе.

  1. объявить глобальный List<string> как это:

    public static List<string> MainMethodArgs = new List<string>();.

  2. В методе Main установите значение списка MainMethodArgs равным значения, передаваемые в метод Main через args, например:

    MainMethodArgs = args.ToList();

  3. При создании метода Run() измените сигнатуру так, чтобы она ожидала string[] вызывается args для передачи ему так:

    public static void Run(string[] args) { .... }

  4. Везде, где в программе вызывается метод 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());
            }
        }
    }
}

Фактически программа «перезапускается» без необходимости перезапуска исполняемого файла и закрытия существующего экземпляра программы. Мне это кажется гораздо более «программистским».

Наслаждайтесь.

0 голосов
/ 01 апреля 2018
//here the code to restart the console...
System.Diagnostics.Process.Start(Environment.GetCommandLineArgs()[0], Environment.GetCommandLineArgs().Length > 1 ? string.Join(" ", Environment.GetCommandLineArgs().Skip(1)) : null);
0 голосов
/ 22 мая 2013

попробуй так:

// start new process
System.Diagnostics.Process.Start(
     Environment.GetCommandLineArgs()[0], 
     Environment.GetCommandLineArgs()[1]);

// close current process
Environment.Exit(0);
0 голосов
/ 18 апреля 2011

Все обдумывают это. Попробуйте что-то вроде этого:

class Program : IDisposable
{

    class RestartException : Exception
    {
        public RestartException() : base()
        {
        }
        public RestartException( string message ) : base(message)
        {
        }
        public RestartException( string message , Exception innerException) : base( message , innerException )
        {
        }
        protected RestartException( SerializationInfo info , StreamingContext context ) : base( info , context )
        {
        }
    }

    static int Main( string[] argv )
    {
        int  rc                      ;
        bool restartExceptionThrown ;

        do
        {
            restartExceptionThrown = false ;
            try
            {
                using ( Program appInstance = new Program( argv ) )
                {
                    rc = appInstance.Execute() ;
                }
            }
            catch ( RestartException )
            {
                restartExceptionThrown = true ;
            }
        } while ( restartExceptionThrown ) ;
        return rc ;
    }

    public Program( string[] argv )
    {
        // initialization logic here
    }

    public int Execute()
    {
        // core of your program here
        DoSomething() ;
        if ( restartNeeded )
        {
            throw new RestartException() ;
        }
        DoSomethingMore() ;
        return applicationStatus ;
    }

    public void Dispose()
    {
        // dispose of any resources used by this instance
    }

}
0 голосов
/ 18 апреля 2011

Запустить второй exe-файл, который завершает консольную программу, запускает новый экземпляр и завершает сам себя?

быть явным, как это в коде?

В этом пространстве имен должно быть все, что вам нужно, если вы хотите воспользоваться этим решением.

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx

...