Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 用于检查更新、安装应用程序新版本的代码_Wpf_.net 4.0 - Fatal编程技术网

Wpf 用于检查更新、安装应用程序新版本的代码

Wpf 用于检查更新、安装应用程序新版本的代码,wpf,.net-4.0,Wpf,.net 4.0,我有一个.NET 4 WPF应用程序,它是通过VisualStudio安装项目生成的MSI安装的。一切都很好,除了我缺少一个Click-Once部署功能,该功能可以检查应用程序的新版本,并下载/安装它们。我不再使用Click Once部署,因为这似乎是一个半生不熟的解决方案,它让你做黑客只是为了做一些简单的事情,比如让你的应用程序在启动时运行 我想知道是否有任何类型的教程或代码,任何人都可以告诉我,如何处理检查新版本的应用程序,下载新版本的应用程序,并安装新的应用程序在旧的。这似乎是大多数WPF

我有一个.NET 4 WPF应用程序,它是通过VisualStudio安装项目生成的MSI安装的。一切都很好,除了我缺少一个Click-Once部署功能,该功能可以检查应用程序的新版本,并下载/安装它们。我不再使用Click Once部署,因为这似乎是一个半生不熟的解决方案,它让你做黑客只是为了做一些简单的事情,比如让你的应用程序在启动时运行


我想知道是否有任何类型的教程或代码,任何人都可以告诉我,如何处理检查新版本的应用程序,下载新版本的应用程序,并安装新的应用程序在旧的。这似乎是大多数WPF应用程序都想要的东西,我很惊讶我在谷歌上找不到任何关于这一点的东西。

查看Scott Hanselman的博客文章。

没有这样的内置或现成的工具。在应用程序启动时,您可以运行代码,该代码执行以下操作

  • 获取您的,您将保留最新版本的设置和新更新msi文件的url
  • 如果可用的更新与当前运行的版本不同,则使用WebClient下载该文件并将其存储在临时文件夹中
  • 然后,您可以使用以下字符串创建一个批处理文件,并将其存储在临时文件夹中

  • 最后使用Process执行批处理文件。启动并退出应用程序

    成功了,下面是代码,这样其他人就不需要重新发明轮子了

    public class VersionHelper
    {
        private string MSIFilePath = Path.Combine(Environment.CurrentDirectory, "HoustersCrawler.msi");
        private string CmdFilePath = Path.Combine(Environment.CurrentDirectory, "Install.cmd");
        private string MsiUrl = String.Empty;
    
        public bool CheckForNewVersion()
        {
            MsiUrl = GetNewVersionUrl();
            return MsiUrl.Length > 0;
        }
    
        public void DownloadNewVersion()
        {
            DownloadNewVersion(MsiUrl);
            CreateCmdFile();
            RunCmdFile();
            ExitApplication();
        }
    
        private string GetNewVersionUrl()
        {
            var currentVersion = Convert.ToInt32(ConfigurationManager.AppSettings["Version"]);
            //get xml from url.
            var url = ConfigurationManager.AppSettings["VersionUrl"].ToString();
            var builder = new StringBuilder();
            using (var stringWriter = new StringWriter(builder))
            {
                using (var xmlReader = new XmlTextReader(url))
                {
                    var doc = XDocument.Load(xmlReader);
                    //get versions.
                    var versions = from v in doc.Descendants("version")
                                   select new
                                   {
                                       Name = v.Element("name").Value,
                                       Number = Convert.ToInt32(v.Element("number").Value),
                                       URL = v.Element("url").Value,
                                       Date = Convert.ToDateTime(v.Element("date").Value)
                                   };
                    var version = versions.ToList()[0];
                    //check if latest version newer than current version.
                    if (version.Number > currentVersion)
                    {
                        return version.URL;
                    }
                }
            }
            return String.Empty;
        }
    
        private void DownloadNewVersion(string url)
        {
            //delete existing msi.
            if (File.Exists(MSIFilePath))
            {
                File.Delete(MSIFilePath);
            }
            //download new msi.
            using (var client = new WebClient())
            {
                client.DownloadFile(url, MSIFilePath);
            }
        }
    
        private void CreateCmdFile()
        {
            //check if file exists.
            if (File.Exists(CmdFilePath))
                File.Delete(CmdFilePath);
            //create new file.
            var fi = new FileInfo(CmdFilePath);
            var fileStream = fi.Create();
            fileStream.Close();
            //write commands to file.
            using (TextWriter writer = new StreamWriter(CmdFilePath))
            {
                writer.WriteLine(@"msiexec /i HoustersCrawler.msi /quiet");
            }
        }
    
        private void RunCmdFile()
        {//run command file to reinstall app.
            var p = new Process();
            p.StartInfo = new ProcessStartInfo("cmd.exe", "/c Install.cmd");
            p.StartInfo.CreateNoWindow = true;
            p.Start();
            //p.WaitForExit();
        }
    
        private void ExitApplication()
        {//exit the app.
            Application.Current.Shutdown();
        }
    }
    

    感谢@Akash Kava我现在就要离开这里了,但是看到了我在msiexec命令行卸载/安装中遇到的问题。我知道你没有使用ClickOnce,但是,我的搜索将我带到了这里,这将帮助其他使用CO:如何:使用ClickOnce部署API以编程方式检查应用程序更新真是一个很好的答案。但是最好使用代码检查版本,因为它不准确。您应该删除2个未使用的变量-StringBuilder、StringWriter和StringWriter。此外,在funcs CreateCmdFile()和RunCmdFile()中,应将硬编码的“HoustersCrawler.msi”和“Install.cmd”替换为已声明的变量MSIFilePath和CmdFilePath。而且,这两个路径都应该被引用,如下所示:$“msiexec/i\”{msilepath}\“/quiet”
    public class VersionHelper
    {
        private string MSIFilePath = Path.Combine(Environment.CurrentDirectory, "HoustersCrawler.msi");
        private string CmdFilePath = Path.Combine(Environment.CurrentDirectory, "Install.cmd");
        private string MsiUrl = String.Empty;
    
        public bool CheckForNewVersion()
        {
            MsiUrl = GetNewVersionUrl();
            return MsiUrl.Length > 0;
        }
    
        public void DownloadNewVersion()
        {
            DownloadNewVersion(MsiUrl);
            CreateCmdFile();
            RunCmdFile();
            ExitApplication();
        }
    
        private string GetNewVersionUrl()
        {
            var currentVersion = Convert.ToInt32(ConfigurationManager.AppSettings["Version"]);
            //get xml from url.
            var url = ConfigurationManager.AppSettings["VersionUrl"].ToString();
            var builder = new StringBuilder();
            using (var stringWriter = new StringWriter(builder))
            {
                using (var xmlReader = new XmlTextReader(url))
                {
                    var doc = XDocument.Load(xmlReader);
                    //get versions.
                    var versions = from v in doc.Descendants("version")
                                   select new
                                   {
                                       Name = v.Element("name").Value,
                                       Number = Convert.ToInt32(v.Element("number").Value),
                                       URL = v.Element("url").Value,
                                       Date = Convert.ToDateTime(v.Element("date").Value)
                                   };
                    var version = versions.ToList()[0];
                    //check if latest version newer than current version.
                    if (version.Number > currentVersion)
                    {
                        return version.URL;
                    }
                }
            }
            return String.Empty;
        }
    
        private void DownloadNewVersion(string url)
        {
            //delete existing msi.
            if (File.Exists(MSIFilePath))
            {
                File.Delete(MSIFilePath);
            }
            //download new msi.
            using (var client = new WebClient())
            {
                client.DownloadFile(url, MSIFilePath);
            }
        }
    
        private void CreateCmdFile()
        {
            //check if file exists.
            if (File.Exists(CmdFilePath))
                File.Delete(CmdFilePath);
            //create new file.
            var fi = new FileInfo(CmdFilePath);
            var fileStream = fi.Create();
            fileStream.Close();
            //write commands to file.
            using (TextWriter writer = new StreamWriter(CmdFilePath))
            {
                writer.WriteLine(@"msiexec /i HoustersCrawler.msi /quiet");
            }
        }
    
        private void RunCmdFile()
        {//run command file to reinstall app.
            var p = new Process();
            p.StartInfo = new ProcessStartInfo("cmd.exe", "/c Install.cmd");
            p.StartInfo.CreateNoWindow = true;
            p.Start();
            //p.WaitForExit();
        }
    
        private void ExitApplication()
        {//exit the app.
            Application.Current.Shutdown();
        }
    }