如何重新启动Console应用程序?

时间:2011-04-18 17:22:04

标签: c# console console-application

当用户按“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...
}

感谢

10 个答案:

答案 0 :(得分:12)

// Starts a new instance of the program itself
System.Diagnostics.Process.Start(Application.ExecutablePath);

// Closes the current process
Environment.Exit(0);

答案 1 :(得分:7)

static void Main(string[] args)
{
    var info = Console.ReadKey();
    if (info.Key == ConsoleKey.R)
    {
        var fileName = Assembly.GetExecutingAssembly().Location;
        System.Diagnostics.Process.Start(fileName);
    }
}

答案 2 :(得分:5)

我认为你真的不需要重启整个应用程序。按下R后,只需运行所需的方法。无需重新启动。

答案 3 :(得分:2)

另一种简单方法

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

答案 4 :(得分:1)

我意识到这已经7岁了,但是我才偶然发现。我认为实际上调用可执行文件并关闭当前程序有点麻烦。如前所述,这是深思熟虑的。我认为最干净,最模块化的方法是采用Main方法中的所有内容,并采用其他方法,例如Run()包含Main方法中的所有内容,然后从Run()方法或代码中希望重新启动程序的任何地方调用新的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方法中的所有内容,只需将您的主要方法设置为:

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

实际上,程序是“重新启动”的,而不必重新运行可执行文件并关闭程序的现有实例。对我来说,这似乎更像是“程序员喜欢的东西”。

享受。

答案 5 :(得分:0)

启动第二个exe,结束控制台程序,启动一个新实例,并自行结束?

要明确,代码是怎么回事?

如果这是你想要追求的解决方案,那么这个命名空间应该包含你需要的一切。

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

答案 6 :(得分:0)

每个人都在考虑这个问题。尝试这样的事情:

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
    }

}

答案 7 :(得分:0)

尝试这样:

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

// close current process
Environment.Exit(0);

答案 8 :(得分:0)

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

答案 9 :(得分:0)

以这样的方式结束。

#if DEBUG
Process.Start("dotnet", Environment.GetCommandLineArgs().Prepend("run").Take(2));
#else
Process.Start(Environment.CommandLine);
#endif
Quit.ConsoleShutdown(null, null);

我确信这个特定的行:Process.Start("dotnet", Environment.GetCommandLineArgs().Prepend("run").Take(2)); 可以改进,因为乍一看它看起来有点混乱。