Добавляем функцию "Проверить обновления" для своей программы

     Проверка обновлений полезная опция для программы, особенно если пользователь не знает официальный сайт вашей программы (а может его и нету). В таком случае необходимо пользователю предоставить такую возможность.

     Общая идея 

     Во-первых, необходимо предоставить приложению возможность получать информацию о новой версии. Для этого у нас будет XML файл, который будет хранится в интернете. В этом файле мы будем хранить номер новой версии нашего приложения. При проверке обновления, мы скачаем этот XML файл, распарсим его и сравним с текущей версией приложения.

     Скачиваем и разбираем XML файл

     Это достаточно легко - будем использовать XmlTextReader, с его помощью скачаем наш файл. Так будет выглядеть наш XML файл:

<?xml version="1.0" encoding="utf-8"?>  
<ourapp>
<version>1.2.3.4444</version>
<url>http://some.domain/our_app_homepage/</url>
</ourapp>

     Теперь давайте скачаем и разберем наш файл:

// здесь сохраним номер версии из XML файла
Version newVersion = null;
//в этой переменной сохраним адрес новой версии программы
string url = "";
XmlTextReader reader;
try
{
// создаем XmlTextReader и в качестве аргумента передаем
// путь до нашего XML файла
string xmlURL = "http://domain/app_version.xml";
reader = new XmlTextReader(xmlURL);
// пропускаем различный "мусор" в начале
reader.MoveToContent();
// XmlTextReader двигается только вперед,
// мы сохраним текущей элемент xml в переменной
// elementName.
string elementName = "";
// проверяем что текущий узел "ourapp"
if ((reader.NodeType == XmlNodeType.Element) &&
(reader.Name == "ourapp"))
{
while (reader.Read())
{
// когда мы нашли тип элемент,
// мы сохраняем его имя
if (reader.NodeType == XmlNodeType.Element)
elementName = reader.Name;
else
{
if ((reader.NodeType == XmlNodeType.Text) &&
(reader.HasValue))
{
// проверяем имя узла, нам нужно version
// и url
switch (elementName)
{
case "version":
// класс Version распарсить за нас версию
newVersion = new Version(reader.Value);
break;
case "url":
url = reader.Value;
break;
}
}
}
}
}
}
catch (Exception)
{
}
finally
{
if (reader != null) reader.Close();
}

     Сравниваем версии


     Тут код также простой:

// получаем текущую версию  
Version curVersion =
System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
// сравниваем версии
if (curVersion.CompareTo(newVersion) < 0)
{
// спросим пользователя хочет ли он
// скачать новую версию
string title = "Новая версия доступна.";
string question = "Скачать новую версию?";
if (DialogResult.Yes ==
MessageBox.Show(this, question, title,
MessageBoxButtons.YesNo,
MessageBoxIcon.Question))
{
// переходим на страницу программы
System.Diagnostics.Process.Start(url);
}
}

     Вот и все. Как Вы заметили задача проста.

6

  1. Artyom Krivokrisenko комментирует...:

    По-моему для разбора такого маленького XML файла нет нужны использовать XmlTextReader, очень громоздкий код получается. Гораздо проще (реально в несколько строк кода) сделать на XDocument.

    Еще хотелось бы увидеть вариант программной проверки наличия обновлений программы, установленой через ClickOnce.

  1. sharok комментирует...:

    Я выбрал такой файл как пример, на самом деле там может быть еще какая либо дополнительная информация. Про ClickOnce напишу в ближайшие дни.

  1. Анонимный комментирует...:

    Намного проще для разбора Xml использовать десериализацию и потом работа с последующим классом обновления будет легче.

  1. ShurikEv комментирует...:

    Поддерживаю: работать с XMLDocument в таком случае просто. Достаточно написать правильные XPath. А десериализация - спорный вопрос. В принципе для разового запуска ничего страшного нет.

  1. zerkms комментирует...:

    Из пушки по воробьям. Есть ClickOnce.

    Artyom Krivokrisenko: http://msdn.microsoft.com/en-us/library/ms404263.aspx - исчерпывающе о том, как работать с ClickOnce программно

  1. Анонимный комментирует...:

    Есть такая вещь - ClickOnce называется. Если проектик простой, работает на ура.

Отправить комментарий