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

时间:2011-03-13 19:53:52

标签: c# wpf deployment clickonce

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

6 个答案:

答案 0 :(得分:19)

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

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/

答案 1 :(得分:14)

没有必要为此包括winforms组件,这看起来有点矫枉过正。

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

String ApplicationEntryPoint = ApplicationDeployment.CurrentDeployment.UpdatedApplicationFullName;

Process.Start(ApplicationEntryPoint);

//shutdown current instance here

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

答案 2 :(得分:2)

        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();
            }
        }

答案 3 :(得分:1)

启动应用程序后(双击.application文件),您将不会自动注意到,因为框架在启动时为您执行的一件事是检查您的本地版本是否早于应用程序下载站点中的那个。

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

答案 4 :(得分:1)

使用Michael提供的内容:

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.)

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

如果你真的很想,你可以在最后的 else 语句中,而不是抛出异常,在temp目录中创建一个appref-ms文件(谷歌会帮助)执行。

答案 5 :(得分:0)

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

完成!