用于检查更新的代码,安装新版本的应用

时间:2011-02-05 14:39:10

标签: wpf .net-4.0

我有一个使用MSI安装的.NET 4 WPF应用程序,通过visual studio安装项目生成。一切都很好,除了我错过了Click Once Deployment功能,该功能在加载时检查应用程序的新版本并下载/安装它们。我改变了Click Once Deployment,因为它似乎是一个半生不熟的解决方案,只会让你做一些简单的事情,比如让你的应用在启动时运行。

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

3 个答案:

答案 0 :(得分:15)

让它工作,这是代码,以便其他人不需要重新发明轮子......

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

答案 1 :(得分:13)

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

  1. 获取您的http://myserver.com/myproduct/update.xml,您将在其中保存最新版本的设置和新更新msi文件的网址
  2. 如果可用的更新与当前运行的版本不同,则使用WebClient下载文件并将其存储在临时文件夹中
  3. 然后,您可以使用以下字符串创建批处理文件并将其存储在临时文件夹
  4. msiexec /u {your product code}
    msiexec /i ..path to your new msi
    

    最后使用Process.Start执行批处理文件并退出应用程序。

答案 2 :(得分:2)

查看Scott Hanselman关于manually update via clickonce的博客文章。