如何重新启动控制台应用程序
本文关键字:应用程序 控制台 重新启动 | 更新日期: 2023-09-27 17:50:34
当用户按下"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...
}
感谢
// Starts a new instance of the program itself
System.Diagnostics.Process.Start(Application.ExecutablePath);
// Closes the current process
Environment.Exit(0);
static void Main(string[] args)
{
var info = Console.ReadKey();
if (info.Key == ConsoleKey.R)
{
var fileName = Assembly.GetExecutingAssembly().Location;
System.Diagnostics.Process.Start(fileName);
}
}
我不认为您真的需要重新启动整个应用程序。只需在按下R后运行所需的方法。无需重新启动。
另一种简单的方法
//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);
我意识到这已经7岁了,但我刚刚遇到了这个。我认为实际调用可执行文件并关闭当前程序有点笨拙。如前所述,这是经过深思熟虑的。我认为最干净、最模块化的方法是取Main
方法中的所有内容,并创建一个不同的方法,比如Run()
,它包含Main
方法中的全部内容,然后从Main
方法调用新的Run()
方法,或者在代码中需要重新启动程序的任何位置。
因此,如果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();
}
所以这是对整个程序的简化:
编辑:当我最初发布这篇文章时,我没有考虑任何可能传递给程序的参数。为了解释这四件事,我最初的回答需要改变。
像这样声明全局
List<string>
:public static List<string> MainMethodArgs = new List<string>();
。在
Main
方法中,将MainMethodArgs
列表的值设置为通过args
传递到Main
方法的值如下: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());
}
}
}
}
实际上,程序是"重新启动"的,而不必重新运行可执行文件并关闭程序的现有实例。这对我来说似乎更像"程序员">
享受吧。
这样尝试:
// start new process
System.Diagnostics.Process.Start(
Environment.GetCommandLineArgs()[0],
Environment.GetCommandLineArgs()[1]);
// close current process
Environment.Exit(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));
可以改进,因为乍一看有点令人困惑。
启动第二个exe,结束控制台程序,启动新实例,并结束自身
要显式,它在代码中是如何实现的
如果这是您想要追求的解决方案,那么这个名称空间应该拥有您所需要的一切。
http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx
//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);
每个人都想得太多了。试试这样的东西:
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
}
}