簡體   English   中英

點擊一次更新后重啟WPF應用程序(啟動新版本)

[英]Restart WPF application after click-once update (start the new version)

如何使用click-once更新WPF應用程序,我需要啟動新版本!

有幾種方法,但大多數不能正常工作,他們最終重新打開舊版本。

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初始化。

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

使用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語句中,而不是拋出異常,在temp目錄中創建一個appref-ms文件(谷歌會幫助)並執行它。

一旦你啟動你的應用程序(雙擊.application文件,那就是),你就不會自動注意到,因為框架在啟動時為你做的一件事就是檢查你的本地版本是否比在該應用程序的下載站點。

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

右鍵單擊解決方案資源管理器中的引用>單擊添加引用>單擊程序集>搜索並在MainWindow中添加System.Windows.Forms>添加“System.Windows.Forms.Application.Restart();”。

完成!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM