有几种方法,但大多数都无法正常工作,它们最终会重新打开旧版本。
听起来很疯狂,WPF没有正确处理它的方法 (#fixwpf),但您需要引用System.Windows.Forms.dll
并调用System.Windows.Forms.Application.Restart();
快速搜索发现 Rob Relyea 在他的帖子中也提到了同样的问题 (XAML, WPF Microsoft Guy) http://robrelyea.wordpress.com/2007/07/24/application-restart-for-wpf/
为此而添加winforms程序集似乎有些过度,没有必要这样做。
在更新已应用之后,您可以执行与winforms在其重新启动方法背后执行的相同操作。
String ApplicationEntryPoint = ApplicationDeployment.CurrentDeployment.UpdatedApplicationFullName;
Process.Start(ApplicationEntryPoint);
//shutdown current instance here
这将使用适当的ClickOnce初始化开始您的应用程序的新版本。
String ApplicationEntryPoint = ApplicationDeployment.CurrentDeployment.UpdateLocation.AbsoluteUri;
。 - Carlos Blanco private static void RestartClickOnceApplication()
{
try
{
XDocument xDocument;
using (MemoryStream memoryStream = new MemoryStream(AppDomain.CurrentDomain.ActivationContext.DeploymentManifestBytes))
using (XmlTextReader xmlTextReader = new XmlTextReader(memoryStream))
{
xDocument = XDocument.Load(xmlTextReader);
}
var description = xDocument.Root.Elements().Where(p => p.Name.LocalName == "description").First();
var publisher = description.Attributes().Where(a => a.Name.LocalName == "publisher").First();
var product = description.Attributes().Where(a => a.Name.LocalName == "product").First();
var path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.StartMenu) + @"\Programs\";
path += publisher.Value + @"\" + product.Value + ".appref-ms";
if (File.Exists(path))
{
Process.Start(path);
Application.Current.Shutdown();
}
else
{
Application.Current.Shutdown();
}
}
catch
{
Application.Current.Shutdown();
}
}
var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.StartMenu), "Programs", publisher.Value, product.Value, product.Value + ".appref-ms");
- Витёк СинёвString ApplicationEntryPoint = ApplicationDeployment.CurrentDeployment.UpdatedApplicationFullName;
Process.Start(ApplicationEntryPoint);
确实存在浏览器无法正确处理的问题。例如,Edge在打开您的应用程序后会留下一个空白的浏览器页面。由于ApplicationDeployment.CurrentDeployment.UpdatedApplicationFullName
指向一个很长的http网址,理论上也存在这样一种可能性,即在下载完成后的瞬间您的互联网断开连接,因此您的应用程序将无法重新启动(无法访问该网址)。
我选择了以下解决方案:
... 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.)
一旦您启动了应用程序(即双击.application文件),您不会自动注意到,因为框架在启动时只会为您检查本地版本是否比应用程序下载站点中的版本旧。
但是,您可以使用ApplicationDeployment类来检查更新,它具有所有必要的手段。
在解决方案资源管理器中右键单击引用 > 单击添加引用 > 单击程序集 > 搜索并添加 System.Windows.Forms > 在 MainWindow 中添加 "System.Windows.Forms.Application.Restart();"。
完成!