Normally if you need to restart a WPF application programatically, you would use the following code:
private void Restart()
{
System.Diagnostics.Process.Start(
Application.ResourceAssembly.Location);
Application.Current.Shutdown();
}
If you have a ClickOnce WPF application, you do not want to do this. In order to understand why, you need to understand how a ClickOnce application is normally launched.
The shortcut you click on in the Start menu is not a normal shortcut to an executable. It is actually an appref-ms file, which defines the entry point and location of the application. When you launch using this file, all the parameters in ApplicationDeployment
are correctly initialized, and ApplicationDeployment.IsNetworkDeployed
is set to true
.
However, if you use the code above, you launch using the application’s entry executable instead of the appref-ms. This will cause ApplicationDeployment.IsNetworkDeployed
to be false
, and the properties will not be initialized as if they were a ClickOnce deployment.
According to Rob Relyea’s post, Application.Restart() for WPF, you can get the desired functionality with the following code. I have not had a chance to verify that this works as expected, but I will update this post as soon as I do.
UPDATE: I’ve verified that the following code does work properly. Sadly, you will need a reference to the System.Windows.Forms.dll
.
private void Restart()
{
// from System.Windows.Forms.dll
System.Windows.Forms.Application.Restart();
Application.Current.Shutdown();
}