Код для проверки обновлений, установите новую версию приложения - PullRequest
12 голосов
/ 05 февраля 2011

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

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

Ответы [ 3 ]

15 голосов
/ 05 февраля 2011

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

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();
    }
}
13 голосов
/ 05 февраля 2011

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

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

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

2 голосов
/ 05 февраля 2011

Посмотрите в блоге Скотта Хансельмана о обновлении вручную с помощью clickonce .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...