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

Jus*_*tin 12 wpf .net-4.0

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

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

Jus*_*tin 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();
    }
}
Run Code Online (Sandbox Code Playgroud)


Aka*_*ava 14

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

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

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