点击一次更新后重启WPF应用程序(启动新版本)

如何使用click-once更新WPF应用程序,我需要启动新版本!

有几种方法,但大多数不能正常工作,他们最终重新打开旧版本。

WPF没有正确的处理方式(#fixwpf)听起来很疯狂,但你需要引用System.Windows.Forms.dll并调用System.Windows.Forms.Application.Restart();

快速搜索发现Rob Relyea关于同样事情的post(XAML,WPF Microsoft Guy) http://robrelyea.wordpress.com/2007/07/24/application-restart-for-wpf/

没有必要为此包括winforms组件,这似乎有点矫枉过正。

你可以在win的重启方法中做winforms在幕后做的事情。 更新已应用后:

 String ApplicationEntryPoint = ApplicationDeployment.CurrentDeployment.UpdatedApplicationFullName; Process.Start(ApplicationEntryPoint); //shutdown current instance here 

这将启动应用程序的新版本使用正确的ClickOnce初始化。

一旦你启动你的应用程序(双击.application文件,那就是),你就不会自动注意到,因为框架在启动时为你做的一件事就是检查你的本地版本是否比在该应用程序的下载站点。

但是您可以使用ApplicationDeployment-Class来检查更新,它具有IIRC所需的一切手段。

使用Michael提供的内容:

 String ApplicationEntryPoint = ApplicationDeployment.CurrentDeployment.UpdatedApplicationFullName; Process.Start(ApplicationEntryPoint); 

确实存在浏览器无法正确处理它的问题。 例如,Edge会在打开您的应用后留下空白的浏览器页面。 由于ApplicationDeployment.CurrentDeployment.UpdatedApplicationFullName引用了一个很长的http url地址,因此理论上也有可能在下载完成后您的Internet退出分秒,因此您的应用程序将无法重新启动(无法访问该URL)。

我改为:

 ... Update() if (System.IO.File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.StartMenu) + "\\Programs\\MyCompany\\MyApp.appref-ms")) { System.Diagnostics.Process.Start(Environment.GetFolderPath(Environment.SpecialFolder.StartMenu) + "\\Programs\\MyCompany\\MyApp.appref-ms"); } else if (System.IO.File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\MyApp.appref-ms")) { System.Diagnostics.Process.Start(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\MyApp.appref-ms"); } else throw new InvalidOperationException("Cannot restart the application, because StartMenu and Desktop shortcuts are missing!"); ... shut down application (this.Close() etc.) 

这当然是假设您指定了ClickOnce部署来创建快捷方式,并且没有人删除它们。 但这种可能性非常低。 (如果没有这些快捷方式,用户可能无法执行您的应用程序,因为ClickOnce将.exe部署到非常隐蔽的位置)

如果你真的非常想,你可以在最后的else语句中,而不是抛出exception,在temp目录中创建一个appref-ms文件(google将帮助)并执行它。

右键单击解决方案资源管理器中的引用>单击添加引用>单击程序集>搜索并在MainWindow中添加System.Windows.Forms>添加“System.Windows.Forms.Application.Restart();”。

完成!