Добавляем функцию "Проверить обновления" для своей программы
Проверка обновлений полезная опция для программы, особенно если пользователь не знает официальный сайт вашей программы (а может его и нету). В таком случае необходимо пользователю предоставить такую возможность.
Общая идея
Во-первых, необходимо предоставить приложению возможность получать информацию о новой версии. Для этого у нас будет 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
Подписаться на:
Комментарии к сообщению (Atom)
9 сентября 2010 г. в 15:23
По-моему для разбора такого маленького XML файла нет нужны использовать XmlTextReader, очень громоздкий код получается. Гораздо проще (реально в несколько строк кода) сделать на XDocument.
Еще хотелось бы увидеть вариант программной проверки наличия обновлений программы, установленой через ClickOnce.
9 сентября 2010 г. в 15:49
Я выбрал такой файл как пример, на самом деле там может быть еще какая либо дополнительная информация. Про ClickOnce напишу в ближайшие дни.
9 сентября 2010 г. в 16:24
Намного проще для разбора Xml использовать десериализацию и потом работа с последующим классом обновления будет легче.
9 сентября 2010 г. в 17:15
Поддерживаю: работать с XMLDocument в таком случае просто. Достаточно написать правильные XPath. А десериализация - спорный вопрос. В принципе для разового запуска ничего страшного нет.
9 сентября 2010 г. в 18:21
Из пушки по воробьям. Есть ClickOnce.
Artyom Krivokrisenko: http://msdn.microsoft.com/en-us/library/ms404263.aspx - исчерпывающе о том, как работать с ClickOnce программно
11 сентября 2010 г. в 16:09
Есть такая вещь - ClickOnce называется. Если проектик простой, работает на ура.