18

自分自身を再起動する機能を使ってアプリケーションを構築したい。codeprojectで見つけました

ProcessStartInfo Info=new ProcessStartInfo();
Info.Arguments="/C choice /C Y /N /D Y /T 3 & Del "+
               Application.ExecutablePath;
Info.WindowStyle=ProcessWindowStyle.Hidden;
Info.CreateNoWindow=true;
Info.FileName="cmd.exe";
Process.Start(Info); 
Application.Exit();

これはまったく機能しません...そして他の問題は、このようにそれを再開する方法ですか?たぶん、アプリケーションを起動するための引数もあります。

編集:

http://www.codeproject.com/script/Articles/ArticleVersion.aspx?aid=31454&av=58703
4

10 に答える 10

46

アプリを再起動するときに試したコードと同様のコードを使用します。次のように、時限cmdコマンドを送信してアプリを再起動します。

ProcessStartInfo Info = new ProcessStartInfo();
Info.Arguments = "/C ping 127.0.0.1 -n 2 && \"" + Application.ExecutablePath + "\"";
Info.WindowStyle = ProcessWindowStyle.Hidden;
Info.CreateNoWindow = true;
Info.FileName = "cmd.exe";
Process.Start(Info);
Application.Exit(); 

コマンドがOSに送信され、pingがスクリプトを2〜3秒間一時停止します。その時点で、アプリケーションは終了しApplication.Exit()、ping後の次のコマンドがスクリプトを再開します。

注:\"パスにスペースがある場合は、パスを引用符で囲みます。スペースがある場合、cmdは引用符なしでは処理できません。

お役に立てれば!

于 2012-03-08T09:54:34.100 に答える
29

使ってみませんか

Application.Restart();

??

再起動の詳細

于 2012-03-07T15:15:28.023 に答える
9

なぜ次だけではないのですか?

Process.Start(Application.ExecutablePath); 
Application.Exit();

アプリが2回実行されないようにする場合Environment.Exit(-1)は、プロセスを瞬時に強制終了する(実際には良い方法ではありません)か、メインアプリのプロセスをチェックしてすぐに再起動する2番目のアプリを起動するような方法を使用します。プロセスは終了しました。

于 2012-03-07T15:10:41.697 に答える
6

最初のアプリケーションAがあり、再起動します。したがって、Aを強制終了する場合は、小さなアプリケーションBが起動され、BがAを強制終了し、次にBがAを起動し、Bを強制終了します。

プロセスを開始するには:

Process.Start("A.exe");

プロセスを強制終了するには、次のようなものです

Process[] procs = Process.GetProcessesByName("B");

foreach (Process proc in procs)
   proc.Kill();
于 2012-03-07T15:18:03.653 に答える
3

多くの人がApplication.Restartの使用を提案しています。実際には、この機能が期待どおりに機能することはめったにありません。呼び出し元のアプリケーションをシャットダウンしたことはありません。メインフォームを閉じるなど、他の方法でアプリケーションを閉じる必要がありました。

これを処理するには2つの方法があります。呼び出しプロセスを閉じて新しいプロセスを開始する外部プログラムがあるか、

また、

引数がrestartとして渡された場合、新しいソフトウェアの開始時に同じアプリケーションの他のインスタンスを強制終了します。

        private void Application_Startup(object sender, StartupEventArgs e)
        {
            try
            {
                if (e.Args.Length > 0)
                {
                    foreach (string arg in e.Args)
                    {
                        if (arg == "-restart")
                        {
                            // WaitForConnection.exe
                            foreach (Process p in Process.GetProcesses())
                            {
                                // In case we get Access Denied
                                try
                                {
                                    if (p.MainModule.FileName.ToLower().EndsWith("yourapp.exe"))
                                    {
                                        p.Kill();
                                        p.WaitForExit();
                                        break;
                                    }
                                }
                                catch
                                { }
                            }
                        }
                    }
                }
            }
            catch
            {
            }
        }
于 2012-03-07T15:45:47.353 に答える
2

これらのソリューションよりも少しクリーンに感じるこれを行う別の方法は、現在のアプリケーションが終了するのを待つ特定の遅延を含むバッチファイルを実行することです。これには、2つのアプリケーションインスタンスが同時に開かないようにするという追加の利点があります。

Windowsバッチファイルの例( "restart.bat"):

sleep 5
start "" "C:\Dev\MyApplication.exe"

アプリケーションで、次のコードを追加します。

// Launch the restart batch file
Process.Start(@"C:\Dev\restart.bat");

// Close the current application (for WPF case)
Application.Current.MainWindow.Close();

// Close the current application (for WinForms case)
Application.Exit();
于 2012-05-15T02:32:17.877 に答える
2

Winformsには、Application.Restart()まさにそれを行うメソッドがあります。WPFを使用している場合は、への参照を追加しSystem.Windows.Formsて呼び出すだけです。

于 2012-03-07T15:16:31.740 に答える
1

私の解決策:

        private static bool _exiting;
    private static readonly object SynchObj = new object();

        public static void ApplicationRestart(params string[] commandLine)
    {
        lock (SynchObj)
        {
            if (Assembly.GetEntryAssembly() == null)
            {
                throw new NotSupportedException("RestartNotSupported");
            }

            if (_exiting)
            {
                return;
            }

            _exiting = true;

            if (Environment.OSVersion.Version.Major < 6)
            {
                return;
            }

            bool cancelExit = true;

            try
            {
                List<Form> openForms = Application.OpenForms.OfType<Form>().ToList();

                for (int i = openForms.Count - 1; i >= 0; i--)
                {
                    Form f = openForms[i];

                    if (f.InvokeRequired)
                    {
                        f.Invoke(new MethodInvoker(() =>
                        {
                            f.FormClosing += (sender, args) => cancelExit = args.Cancel;
                            f.Close();
                        }));
                    }
                    else
                    {
                        f.FormClosing += (sender, args) => cancelExit = args.Cancel;
                        f.Close();
                    }

                    if (cancelExit) break;
                }

                if (cancelExit) return;

                Process.Start(new ProcessStartInfo
                {
                    UseShellExecute = true,
                    WorkingDirectory = Environment.CurrentDirectory,
                    FileName = Application.ExecutablePath,
                    Arguments = commandLine.Length > 0 ? string.Join(" ", commandLine) : string.Empty
                });

                Application.Exit();
            }
            finally
            {
                _exiting = false;
            }
        }
    }
于 2016-07-04T21:41:53.140 に答える
1

これは私のために働いた:

Process.Start(Process.GetCurrentProcess().MainModule.FileName);
Application.Current.Shutdown();

他の答えのいくつかは、最初のアプリケーションが終了するまで待つなどのping素晴らしいものがありますが、単純なものが必要な場合は、これは便利です。

于 2020-11-16T22:05:20.003 に答える
0

.Netアプリケーションソリューションの場合、次のようになります。

System.Web.HttpRuntime.UnloadAppDomain()

myconfigファイルのAppSettingsを変更した後、これを使用してWebアプリケーションを再起動しました。

System.Configuration.Configuration configuration = WebConfigurationManager.OpenWebConfiguration("~");
configuration.AppSettings.Settings["SiteMode"].Value = model.SiteMode.ToString();
configuration.Save();
于 2016-08-17T10:47:46.663 に答える