Код для проверки обновлений, установка новой версии приложения

У меня есть приложение .NET 4 WPF, которое устанавливается с помощью MSI, созданного с помощью проекта настройки визуальной студии. Все работает отлично, за исключением того, что мне не хватает функции Click Once Deployment, которая проверяет наличие новых версий приложения при загрузке и загрузке/установке. Я переключился с Click Once Deployment, потому что это похоже на полубеленое решение, которое заставляет вас делать взломы просто для того, чтобы делать простые вещи, например, при запуске вашего приложения при запуске.

Мне было интересно, есть ли какой-либо учебник или код, который может показать мне, который описывает, как обрабатывать проверку новых версий приложения, загрузку новой версии приложения и установку нового приложения поверх старого, Это похоже на то, что хотелось бы большинству приложений WPF, я удивлен, что ничего не могу найти в Google.

Ответ 1

Нет такого встроенного или готового инструмента. При запуске приложения вы можете запустить свой код, который выполняет следующие действия.

  • Извлеките http://myserver.com/myproduct/update.xml, где вы сохраните настройки своей последней версии и URL нового файла msi для обновления.
  • Если доступно обновление, отличное от текущей версии, загрузите файл с помощью WebClient и сохраните его в папке temp
  • Затем вы можете создать пакетный файл со следующей строкой и сохранить его в папке temp
msiexec /u {your product code}
msiexec /i ..path to your new msi

Наконец Выполните свой командный файл с помощью Process.Start и выйдите из приложения.

Ответ 2

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

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