100

Developing a C# .NET 2.0 WinForm Application. Need the application to close and restart itself.

Application.Restart();

The above method has proven to be unreliable.

What is a better way to restart the application?

Community
  • 1
  • 1
Adam Nofsinger
  • 4,004
  • 3
  • 34
  • 42
  • 3
    I'm curious about the need to restart your app. I've never thought about that need before What are your circumstances? – JeffH Apr 30 '09 at 13:55
  • 1
    Our particular circumstance - a media player application which is supposed to run through some images and flash content in a loop. Should run for days and days without a machine restart, and there is no keyboard/mouse so no user interaction. If the program crashes (unhandled exception), need to restart the program, not exit out or display an error. http://stackoverflow.com/questions/773768/activex-flash-component-in-c-net-2-0-application-causes-memory-leak See that for why the program keeps having exceptions I can't prevent. :( – Adam Nofsinger Apr 30 '09 at 17:23
  • 2
    In the end, a much better solution for our application was to develop a small Watchdog application that gets started (if not running already) from the main application. The watchdog simply checks every 10 seconds or so to see if the main application still has a process running, and if it doesn't, it starts one. Simple, elegant, and much sturdier than trying to restart from the main app. – Adam Nofsinger Feb 23 '11 at 14:33
  • 4
    Another reason for restart is when you change language or have downloaded an update. – Andrew Truckle Jun 16 '16 at 05:22
  • 1
    But what if... The watchdog application crashes? – Metoniem Oct 16 '17 at 15:41
  • @Metoniem I suppose you could have your main application watch for that condition and restart it. Sort of a symbiotic relationship. The reality of it is, though, that your watchdog app should be so simple that it's odds of crashing (or being closed accidentally?) are much, much smaller. – Adam Nofsinger Oct 16 '17 at 16:03
  • @AdamNofsinger Oh right, that would probably work! Cool :) – Metoniem Oct 16 '17 at 19:27
  • Some malware/spyware uses a pair of programs that monitor each other and/or registry entries to remain running. They can be difficult to kill... – JYelton May 29 '18 at 20:45

24 Answers24

107

A much simpler approach that worked for me is:

Application.Restart();
Environment.Exit(0);

This preserves the command-line arguments and works despite event handlers that would normally prevent the application from closing.

The Restart() call tries to exit, starts a new instance anyway and returns. The Exit() call then terminates the process without giving any event handlers a chance to run. There is a very brief period in which both processes are running, which is not a problem in my case, but maybe in other cases.

The exit code 0 in Environment.Exit(0); specifies a clean shutdown. You can also exit with 1 to specify an error occurred.

Judge2020
  • 339
  • 4
  • 23
EMP
  • 59,148
  • 53
  • 164
  • 220
  • 1
    Simple, yet reliable. This should be the accepted answer. I was trying to implement a sign-out feature that would empty all global variables and appear as if the application just started. I was going to just show the panel for logging in and reset all global variables that hold important info from DB to nothing. This made life a lot more simple. Thanks! – DavidG Apr 06 '17 at 04:41
  • System.Windows.Forms.Application.Restart() also works for WPF applications. Tested with Windows 10 OS. – NthDeveloper Jun 02 '18 at 09:51
  • Whaaaat?! You kiddin ... right? C# <3. Have in mind, this by default won't raise `OnClose()` form events and similar. – Artfaith Oct 23 '20 at 16:28
58

If you are in main app form try to use

System.Diagnostics.Process.Start( Application.ExecutablePath); // to start new instance of application
this.Close(); //to turn off current app
Darqer
  • 2,847
  • 9
  • 45
  • 65
  • 7
    It is similar, but different. Application.Exit didn't work form me, and this.Close() did the job. – Darqer Sep 18 '10 at 19:28
  • 1
    May `Enviorment.Exit(0)` will also do the job. – Dwza Sep 25 '17 at 13:44
  • 2
    `Enviorment.Exit` is a dirty and quite invasive exit because it prevents application cleanup code from running. Not the right choice most of the time. – usr Dec 31 '17 at 13:08
42

Unfortunately you can't use Process.Start() to start an instance of the currently running process. According to the Process.Start() docs: "If the process is already running, no additional process resource is started..."

This technique will work fine under the VS debugger (because VS does some kind of magic that causes Process.Start to think the process is not already running), but will fail when not run under the debugger. (Note that this may be OS-specific - I seem to remember that in some of my testing, it worked on either XP or Vista, but I may just be remembering running it under the debugger.)

This technique is exactly the one used by the last programmer on the project on which I'm currently working, and I've been trying to find a workaround for this for quite some time. So far, I've only found one solution, and it just feels dirty and kludgy to me: start a 2nd application, that waits in the background for the first application to terminate, then re-launches the 1st application. I'm sure it would work, but, yuck.

Edit: Using a 2nd application works. All I did in the second app was:

    static void RestartApp(int pid, string applicationName )
    {
        // Wait for the process to terminate
        Process process = null;
        try
        {
            process = Process.GetProcessById(pid);
            process.WaitForExit(1000);
        }
        catch (ArgumentException ex)
        {
            // ArgumentException to indicate that the 
            // process doesn't exist?   LAME!!
        }
        Process.Start(applicationName, "");
    }

(This is a very simplified example. The real code has lots of sanity checking, error handling, etc)

HiredMind
  • 1,827
  • 17
  • 27
  • I agree with HiredMind, and I actually went with the same "Watchdog program" implementation myself shortly after writing the answer. Sorry, should have come back here and updated. I wouldn't think it should feel _too_ horribly ugly/yucky/dirty. The Watchdog program pattern is pretty widely used. – Adam Nofsinger Sep 29 '09 at 19:30
  • You don't actually need a second application on disk... you could use a script and generate it on the fly with a temporary name... I think this may alleviate your sense of guilty having a second application for the sake of restarting your own... Or you could "emit" an entire C# application, compile it, save it to disk and execute it (dirty, dirty thinking).. – Loudenvier Mar 29 '13 at 16:01
  • The first paragraph is not correct: `Process.Start` does not look at the list of running OS processes. This documentation statement only talks about that *object instance* of the `Process` class. The `Process` class can be attached to a running process but it can also be in an unstarted state. In my opinion this is a design screw up. The best practice, IMO, is to never reuse a `Process ` instance and to immediately start it after creation. Ideally, use the static `Process.Start` method. Then, this documentation and design flaw never come into play. – usr Dec 31 '17 at 13:06
  • The code shown here is also unreliable because of `WaitForExit(1000)`. But the entire waiting is not necessary to start a new process. It might be additional behavior that you want, but it's not required to start a new process. – usr Dec 31 '17 at 13:07
  • I don't know about now, but nine years ago (ahem) this was definitely correct. :-) – HiredMind Dec 31 '17 at 20:55
18

I might be late to the party but here is my simple solution and it works like a charm with every application I have:

        try
        {
            //run the program again and close this one
            Process.Start(Application.StartupPath + "\\blabla.exe"); 
            //or you can use Application.ExecutablePath

            //close this one
            Process.GetCurrentProcess().Kill();
        }
        catch
        { }
Desolator
  • 22,411
  • 20
  • 73
  • 96
  • Works very well on Win-7-x64 and Win-XP-x32. I see nothing about any constraints in [the docs](http://msdn.microsoft.com/en-us/library/system.diagnostics.process.start(v=vs.110).aspx). This should be the accepted answer. – Bitterblue Jul 31 '14 at 06:04
  • @Bitterblue The link to the docs you posted states "If the process is already running, no additional process resource is started." It's the 3rd line in the remarks section. I wish it wasn't this way, but it is. – HiredMind Mar 11 '15 at 02:00
  • @HiredMind I guess we could argue about what "constraints" means to each of us. But the section is titled "Remarks" not "Constraints". So I can live with it. And why do you **wish** it wasn't this way? Did you experience any problems with that? Because I didn't. Works flawlessly for me. – Bitterblue Mar 11 '15 at 13:01
  • @HiredMind This is nothing personal or anything but the idea of using a second app or a script just to restart my C# app is repellent to me. Win7 executes this method in Release mode flawlessly so far (I use it to restart my app when user changes language = nothing important). So I would rather tell the user to restart the app manually than to use methods I don't approve of myself. I've used scripts in the past and I totally didn't like it. – Bitterblue Mar 11 '15 at 13:18
  • @BitterBlue I agree that using a 2nd app sucks - I said so in my answer. But have you tried the single-app method outside the debugger? It didn't work on some versions of Windows when left this answer, and Release or Debug mode had nothing to do with it. If it works for you, great! But I got bitten by this problem and what I got were hundreds of angry users. – HiredMind Mar 11 '15 at 16:16
  • @Tommix - you can get the name of the current executable file. its not a big deal you can just make it as dynamic as you want. please read the comment I added in the code "or you can use Application.ExecutablePath". however, this solution is simple and straightforward. I posted it because I've tried all the posted solutions and non of them worked as expected. so use it don't use it up to you. – Desolator Oct 06 '15 at 15:32
  • This works good for me, even when I have a mutex limitign it to one instance. – Andrew Truckle Jun 16 '16 at 08:47
  • After trying all of the above, this is the most consistent solution in all environments. – Nandostyle Dec 27 '18 at 03:02
  • One more thing, if you are in debugging mode this will start another process and the remaining running program will not be related to the ongoing debugging, as a matter of a fact, Visual Studio will take it as the application was just closed. It will also prevent Visual Studio to compile as the Bin file will be in use. So, make sure you close the program opened after the restart. – Nandostyle Dec 30 '18 at 19:35
  • This is the only solution working for me yet. Btw, you could use `Process.Start(Application.ExecutablePath)` as first statement, it does the same but you dont have to type in the exe-filename. – baltermia Mar 25 '21 at 12:12
15

I had the same exact problem and I too had a requirement to prevent duplicate instances - I propose an alternative solution to the one HiredMind is proposing (which will work fine).

What I am doing is starting the new process with the processId of the old process (the one that triggers the restart) as a cmd line argument:

// Shut down the current app instance.
Application.Exit();

// Restart the app passing "/restart [processId]" as cmd line args
Process.Start(Application.ExecutablePath, "/restart" + Process.GetCurrentProcess().Id);

Then when the new app starts I first parse the cm line args and check if the restart flag is there with a processId, then wait for that process to Exit:

if (_isRestart)
{
   try
   {
      // get old process and wait UP TO 5 secs then give up!
      Process oldProcess = Process.GetProcessById(_restartProcessId);
      oldProcess.WaitForExit(5000);
   }
   catch (Exception ex)
   { 
      // the process did not exist - probably already closed!
      //TODO: --> LOG
   }
}

I am obviously not showing all the safety checks that I have in place etc.

Even if not ideal - I find this a valid alternative so that you don't have to have in place a separate app just to handle restart.

JohnIdol
  • 48,899
  • 61
  • 158
  • 242
  • 1
    IMHO that there is a neater solution to this. I also have a requirement to have single instance and allow the user to restart the application (e.g. when it crashes). I nearly implemented your solution, however it occurred to me that it would be better to simply add a different command line argument that *allows* multiple instances to run. – Dennis Oct 31 '11 at 09:31
  • mmm, you're reversing the logic - I like it! Only issue is that if someone figures out the cmd line argument that allows multiple instances strange stuff could happen :D – JohnIdol Nov 01 '11 at 00:02
  • Well, I was fortunate that it was a feature that users had been requesting so it was WIN-WIN. I would prefer they 'find' an `/allowMultipleInstances` flag than the rather strange `/restart` one. – Dennis Nov 01 '11 at 00:05
  • Yeah if you allow for multiple instances that is a better solution for sure :) – JohnIdol Nov 01 '11 at 10:16
  • @JohnIdol Nice. I think I'll change my flag to "-waitForProcessToExit" or something but otherwise that's a more elegant solution. Right now I'm grappling with a ClickOnce problem with referencing one EXE from another EXE, and this would solve that. – HiredMind Mar 11 '15 at 02:05
9

It's simple, you just need to call the Application.Restart() method, this will invoke your application to be restarted. You must also exit from the local environment with an error code:

Application.Restart();
Environment.Exit(int errorcode);
   

You can create an enumeration of error codes so that you application will exit efficeintly.
Another method is to just exit from the application and start the process using the executable path:

Application.Exit();
System.Diagnostics.Process.Start(Application.ExecutablePath);
mt025
  • 273
  • 4
  • 13
Sonu
  • 458
  • 5
  • 13
7

Start/Exit Method

// Get the parameters/arguments passed to program if any
string arguments = string.Empty;
string[] args = Environment.GetCommandLineArgs();
for (int i = 1; i < args.Length; i++) // args[0] is always exe path/filename
    arguments += args[i] + " ";

// Restart current application, with same arguments/parameters
Application.Exit();
System.Diagnostics.Process.Start(Application.ExecutablePath, arguments);

This seems to work better than Application.Restart();

Not sure how this handles if your program protects against multiple instance. My guess is you would be better off launching a second .exe which pauses and then starts your main application for you.

Adam Nofsinger
  • 4,004
  • 3
  • 34
  • 42
  • 2
    That might not work if application is protected from multiple instances. – majkinetor Apr 23 '09 at 10:34
  • Yah, I have a feeling calling Application.Exit() only causes some message to be added to a queue somewhere that needs to be pumped, so the second bit of code here in my answer probably would indeed not work. – Adam Nofsinger Apr 27 '09 at 21:07
  • Unfortunately this technique doesn't work (I wish it did! It's so much more simple than my solution). It will work inside the Visual Studio debugger but not in practice. See my answer for a kludgy solution that works outside the debugger. – HiredMind Sep 09 '09 at 20:15
  • HiredMind might be right. I ended up going with a Watchdog pattern solution. – Adam Nofsinger Feb 10 '10 at 16:40
4

I figured an another solution out, perhaps anyone can use it, too.

string batchContent = "/c \"@ECHO OFF & timeout /t 6 > nul & start \"\" \"$[APPPATH]$\" & exit\"";
batchContent = batchContent.Replace("$[APPPATH]$", Application.ExecutablePath);
Process.Start("cmd", batchContent);
Application.Exit();

Code is simplified so take care of Exceptions and stuff ;)

br4inp4in
  • 41
  • 1
4

Try this code:

bool appNotRestarted = true;

This code must also be in the function:

if (appNotRestarted == true) {
    appNotRestarted = false;
    Application.Restart();
    Application.ExitThread();
}
Michaël
  • 3,679
  • 7
  • 39
  • 64
3

I fear that restarting the entire application using Process is approaching your problem in the wrong way.

An easier way is to modify the Program.cs file to restart:

    static bool restart = true; // A variable that is accessible from program
    static int restartCount = 0; // Count the number of restarts
    static int maxRestarts = 3;  // Maximum restarts before quitting the program

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        while (restart && restartCount < maxRestarts)
        {
           restart = false; // if you like.. the program can set it to true again
           restartCount++;  // mark another restart,
                            // if you want to limit the number of restarts
                            // this is useful if your program is crashing on 
                            // startup and cannot close normally as it will avoid
                            // a potential infinite loop

           try {
              Application.Run(new YourMainForm());
           }
           catch {  // Application has crashed
              restart = true;
           }
        }
    }
Andrew
  • 702
  • 7
  • 24
  • 2
    It is worth mentioning that with this solution you could restart the application X times, then thereafter quit the application to avoid an infinite loop. – RooiWillie Apr 24 '18 at 19:19
  • Thanks @RooiWillie I've added a counter to do just that, in case the program cannot exit normally. – Andrew Apr 26 '18 at 09:29
2

I wanted the new application start up after the old one shuts down.

Using process.WaitForExit() to wait for your own process to shutdown makes no sense. It will always time out.

So, my approach is to use Application.Exit() then wait, but allow events to be processed, for a period of time. Then start a new application with the same arguments as the old.

static void restartApp() {
    string commandLineArgs = getCommandLineArgs();
    string exePath = Application.ExecutablePath;
    try {
        Application.Exit();
        wait_allowingEvents( 1000 );
    } catch( ArgumentException ex ) {
        throw;
    }
    Process.Start( exePath, commandLineArgs );
}

static string getCommandLineArgs() {
    Queue<string> args = new Queue<string>( Environment.GetCommandLineArgs() );
    args.Dequeue(); // args[0] is always exe path/filename
    return string.Join( " ", args.ToArray() );
}

static void wait_allowingEvents( int durationMS ) {
    DateTime start = DateTime.Now;
    do {
        Application.DoEvents();
    } while( start.Subtract( DateTime.Now ).TotalMilliseconds > durationMS );
}
Mike Coxeter
  • 589
  • 1
  • 6
  • 18
2
public static void appReloader()
    {
        //Start a new instance of the current program
        Process.Start(Application.ExecutablePath);

        //close the current application process
        Process.GetCurrentProcess().Kill();
    }

Application.ExecutablePath returns your aplication .exe file path Please follow the order of calls. You might want to place it in a try-catch clause.

Olfredos6
  • 808
  • 10
  • 19
2

The problem of using Application.Restart() is, that it starts a new process but the "old" one is still remaining. Therefor I decided to Kill the old process by using the following code snippet:

            if(Condition){
            Application.Restart();
            Process.GetCurrentProcess().Kill();
            }

And it works proper good. In my case MATLAB and a C# Application are sharing the same SQLite database. If MATLAB is using the database, the Form-App should restart (+Countdown) again, until MATLAB reset its busy bit in the database. (Just for side information)

Ricardo Fercher
  • 917
  • 6
  • 10
2

You could also use Restarter.

Restarter is an application that automatically monitor and restarts crashed or hung programs and applications. It was originally developed to monitor and restart game servers, but it will do the job for any console or form based program or application

Eric J.
  • 147,927
  • 63
  • 340
  • 553
Daniel Rose
  • 17,233
  • 9
  • 65
  • 88
  • 1
    The supplied link no longer works, but I think this is the same application on CNET: http://download.cnet.com/Restarter/3000-2094_4-75810552.html – Surfbutler Nov 06 '15 at 12:34
2

You are forgetting the command-line options/parameters that were passed in to your currently running instance. If you don't pass those in, you are not doing a real restart. Set the Process.StartInfo with a clone of your process' parameters, then do a start.

For example, if your process was started as myexe -f -nosplash myfile.txt, your method would only execute myexe without all those flags and parameters.

Erich Mirabal
  • 9,860
  • 3
  • 34
  • 39
1
Application.Restart();
Environment.Exit(0);
Infectus
  • 11
  • 4
1

How about create a bat file, run the batch file before closing, and then close the current instance.

The batch file does this:

  1. wait in a loop to check whether the process has exited.
  2. start the process.
AZ.
  • 7,333
  • 6
  • 44
  • 62
  • Which is a poor man's watchdog application, which I describe a little more detailed above. The key benefit of a real watchdog application is that it will even handle if the original app dies without being able to spin something off. – Adam Nofsinger Dec 15 '11 at 03:01
  • @AdamNofsinger I see now. I missed that comment. You might want to edit your post with that solution you use. – AZ. Dec 15 '11 at 18:00
1

Here's my 2 cents:

The sequence Start New Instance->Close Current Instance should work even for the applications that don't allow running multiple copies simultaneously as in this case the new instance may be passed a command-line argument which will indicate that there is a restart in progress so checking for other instances running will not be necessary. Waiting for the first instance to actually finish my be implemented too if it's absolutely imperative that no two intstances are running in parallel.

0

I use the following and it does exactly what you are looking for:

ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment;
UpdateCheckInfo info = null;
info = ad.CheckForDetailedUpdate();
if (info.IsUpdateRequired)
{
    ad.UpdateAsync(); // I like the update dialog
    MessageBox.Show("Application was upgraded and will now restart.");
    Environment.Exit(0);
}
TomServo
  • 35
  • 6
0

I had a similar problem, but mine was related to unmanageable memory leak that I couldn't find on an app that has to run 24/7. With the customer I agreed that safe time to restart the app was 03:00AM if the memory consumption was over the defined value.

I tried Application.Restart, but since it seems to use some mechanism that starts new instance while it is already running, I went for another scheme. I used the trick that file system handles persist until process that created them dies. So, from The Application, i dropped the file to the disk, and didn't Dispose() the handle. I used the file to send 'myself' executable and starting directory also (to add flexibility).

Code:

_restartInProgress = true;
string dropFilename = Path.Combine(Application.StartupPath, "restart.dat");
StreamWriter sw = new StreamWriter(new FileStream(dropFilename, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite));
sw.WriteLine(Application.ExecutablePath);
sw.WriteLine(Application.StartupPath);
sw.Flush();
Process.Start(new ProcessStartInfo
{
    FileName = Path.Combine(Application.StartupPath, "VideoPhill.Restarter.exe"),
    WorkingDirectory = Application.StartupPath,
    Arguments = string.Format("\"{0}\"", dropFilename)
});
Close();

Close() at the end would initiate app shutdown, and file handle I used for StreamWriter here would be held open until process really dies. Then...

Restarter.exe comes into action. It TRIES to read the file in exclusive mode, preventing it to gain access until main app wasn't dead, then starts main app, deletes the file and exists. I guess that it can't be simpler:

static void Main(string[] args)
{
    string filename = args[0];
    DateTime start = DateTime.Now;
    bool done = false;
    while ((DateTime.Now - start).TotalSeconds < 30 && !done)
    {
        try
        {
            StreamReader sr = new StreamReader(new FileStream(filename, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite));
            string[] runData = new string[2];
            runData[0] = sr.ReadLine();
            runData[1] = sr.ReadLine();
            Thread.Sleep(1000);
            Process.Start(new ProcessStartInfo { FileName = runData[0], WorkingDirectory = runData[1] });
            sr.Dispose();
            File.Delete(filename);
            done = true;
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Thread.Sleep(1000);
    }
}
Daniel Mošmondor
  • 19,718
  • 12
  • 58
  • 99
0

You could enclose your code inside a function and when restart is needed you can just call the function.

double-beep
  • 5,031
  • 17
  • 33
  • 41
Petr Mach
  • 1
  • 4
0

Take for instance an application that:

  1. While application is not registered; (upon start) the application should prompt the user to register the application and create a login account.

  2. Once registration is submitted and login credentials are created; the application should restart, check for registration and prompt the user to login with the inserted credentials (so the user can access to all the application features).

Problem: By building and launching the application from Visual Studio; any of the 4 alternatives bellow will fail to accomplish the tasks required.

/*
 * Note(s):
 * Take into consideration that the lines bellow don't represent a code block.
 * They are just a representation of possibilities,
 * that can be used to restart the application.
 */

Application.Restart();
Application.Exit();
Environment.Exit(int errorCode);
Process.GetCurrentProcess().Kill();

What happens is: After creating the Registration, Login and calling Application.Restart(); the application will (strangely) reopen the Registration Form and skip data in a Database (even though the resource is set to "Copy if Newer").

Solution: Batch Building the application was (for me) a proof that any of the lines above were actually working as expected. Just not when building and running the application with Visual Studio.

In first place I'd try batch building the application; run it outside Visual Studio and check if Application.Restart() actually works as expected.

Also Check further Info regarding this thread subject: How do I restart my C# WinForm Application?

0

I've found a new way that's pretty convenient and has quite a few upsides.

  • There's never more than one instance running.
  • Command line args are persisted.
  • No exit events are raised from the application.
  • No process handles are broken.

I had a third party application managing my application with Process.Start and using Exit event to reload the application. Many of these solutions would break this implementation which is how I ended up on the following solution.

public static CancellationTokenSource _restartTokenSource;
/// <summary>
///  The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
    // To customize application configuration such as set high DPI settings or default font,
    // see https://aka.ms/applicationconfiguration.
    ApplicationConfiguration.Initialize();

            
    while (_restartTokenSource == null || _restartTokenSource.IsCancellationRequested)
    {
        _restartTokenSource = new System.Threading.CancellationTokenSource();
        _restartTokenSource.Token.Register(() =>
        {  
            foreach (Form form in Application.OpenForms)
                form.Close();
        });

        Application.Run(new FlashMain(args));
    }
}

Since Application.Run blocks until all forms in the application are closed I put this portion of the initialization into a loop that only executes when a CancellationTokenSource is null (the first run) or IsCancellationRequested is true (restart requested).

I register an event on the CancellationTokenSource that closes all forms in the application when .Cancel() is called, therefore unblocking Application.Run and restarting the loop.

Call Program._restartTokenSource.Cancel(); anywhere in the application to restart it.

P.S. This also works great for injecting into a BlazorWebView to restart the application from .NET Core.

clamchoda
  • 4,411
  • 2
  • 36
  • 74
0
using System.Diagnostics;

Process p = new Process();
p.StartInfo.FileName = Application.ExecutablePath;
p.Start();

Thread.Sleep(1000);

Environment.Exit(0);
mjb
  • 7,649
  • 8
  • 44
  • 60