ユーザーが「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...
}
ありがとう
アプリ全体を再起動する必要はないと思います。 Rを押した後、必要なメソッドを実行するだけです。再起動する必要はありません。
// 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);
}
}
別の簡単な方法
//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);
このようにしてみてください:
// start new process
System.Diagnostics.Process.Start(
Environment.GetCommandLineArgs()[0],
Environment.GetCommandLineArgs()[1]);
// close current process
Environment.Exit(0);
コンソールプログラムを終了し、新しいインスタンスを開始し、それ自体を終了する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);
これは7歳だと思いますが、出会ったばかりです。実際に実行可能ファイルを呼び出して現在のプログラムを閉じるのは少し手間がかかると思います。前に述べたように、これは考えすぎです。最もクリーンでモジュール化された方法は、Main
メソッドにあるすべてのものを取得して別のメソッドを作成することだと思います。たとえば、Main
メソッドにあるすべてのものを含むRun()
を作成し、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();
}
したがって、これはプログラム全体を簡略化したものです。
EDIT:これを最初に投稿したとき、プログラムに渡された可能性のある引数は考慮していませんでした。これを説明するために、私の元の答えでは4つのことを変更する必要があります。
次のようにグローバルList<string>
を宣言します。
public static List<string> MainMethodArgs = new List<string>();
。
Main
メソッドで、MainMethodArgs
リストの値を、次のようにMain
を介してargs
メソッドに渡される値と等しく設定します。
MainMethodArgs = args.ToList();
Run()
メソッドを作成するときは、次のようにargs
というstring[]
が渡されることを期待するように署名を変更します。
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());
}
}
}
}
事実上、実行可能ファイルを再実行してプログラムの既存のインスタンスを閉じることなく、プログラムは「再起動」されます。これは私にはもっと「プログラマーのような」ように思えます。
楽しい。
誰もがこれを考えすぎています。次のようなものを試してください。
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
}
}