Перезапустите приложение WPF после однократного обновления (запустите новую версию) - PullRequest
19 голосов
/ 13 марта 2011

Как перезапустить приложение WPF после того, как оно было обновлено с помощью щелчка один раз, мне нужно запустить новую версию!

Ответы [ 6 ]

19 голосов
/ 14 марта 2011

Есть несколько способов, но большинство не работают должным образом, в конечном итоге они снова открывают старую версию.

Будет странно, что WPF не может правильно с этим справиться (#fixwpf), но вам нужно будет сослаться на System.Windows.Forms.dll и позвонить System.Windows.Forms.Application.Restart();

. В результате быстрого поиска был найден пост Роба Рельея о том же (XAML, WPF Microsoft Guy) http://robrelyea.wordpress.com/2007/07/24/application-restart-for-wpf/

15 голосов
/ 25 марта 2013

Нет необходимости включать сборку winforms только для этого, что выглядит как перебор.

Вы можете сделать то же самое, что winforms делает за сценой в своем методе перезапуска.После применения обновления:

String ApplicationEntryPoint = ApplicationDeployment.CurrentDeployment.UpdatedApplicationFullName;

Process.Start(ApplicationEntryPoint);

//shutdown current instance here

Это запустит новую версию вашего приложения с соответствующей инициализацией ClickOnce.

2 голосов
/ 26 ноября 2018
        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();
            }
        }
1 голос
/ 15 января 2016

Используя то, что предоставил Майкл:

String ApplicationEntryPoint = ApplicationDeployment.CurrentDeployment.UpdatedApplicationFullName;

Process.Start(ApplicationEntryPoint);

Действительно ли проблема браузеров не справляется с этим правильно. Например, Edge оставит пустую страницу браузера после открытия вашего приложения. Поскольку ApplicationDeployment.CurrentDeployment.UpdatedApplicationFullName относится к длинному URL-адресу http, существует также теоретическая вероятность того, что ваш Интернет отключится за доли секунды после завершения загрузки, и, следовательно, ваше приложение не будет перезапущено (не может получить доступ к 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 вместо создания исключения создать файл appref-ms (поможет Google) в каталоге temp и выполнить его.

1 голос
/ 21 октября 2011

После того, как вы запустили свое приложение (дважды щелкнув по файлу .application, то есть), вы не заметите это автоматически, поскольку одна вещь, которую платформа делает для вас только при запуске, - это проверка того, что ваша локальная версия старшеодин на сайте загрузки приложения.

Но вы можете использовать ApplicationDeployment-Class для проверки обновлений, у него есть все необходимые средства IIRC.

0 голосов
/ 13 сентября 2013

щелкните правой кнопкой мыши по ссылкам в обозревателе решений> щелкните "Добавить ссылку"> щелкните по сборкам> найдите и добавьте System.Windows.Forms> в MainWindow и добавьте "System.Windows.Forms.Application.Restart ();".

Готово! * * 1003

...