Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.98/57: Рейтинг темы: голосов - 57, средняя оценка - 4.98
 Аватар для Antrix
44 / 44 / 8
Регистрация: 11.04.2010
Сообщений: 139

Реализация "обновления программы"

17.05.2010, 00:30. Показов 12267. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! И вот, опять, я прошу помощи у комьюнити. Что мы имеем:
Программу и файл "базы данных". С обновлением самой базы все предельно ясно и проблем не возникло. А вот как реализовать обновление самого исполняемого файла? Просто открыть браузер со ссылкой на новую версию, аля:
C#
1
Process.Start("www.myprogramsite.ru/newversion.zip");
это, как говорится, не то пальто... можно ли как нибудь сделать обновление "самого себя" (прошу прощения за такое выражение)?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.05.2010, 00:30
Ответы с готовыми решениями:

Реализация авто-обновления программы
Здравствуйте Уважаемые пользователи данного форума! Мне нужна помощь: Реализация авто-обновления программы. Многие сайты и форумы...

Реализация обновления программы на терминальном сервере
Всем привет, сразу скажу я не программист, я сисадмин. Прошу помочь советом\направлением мне или программисту. Есть некая самописная...

Реализация функции обновления
Доброго времени суток, пошарившись по форуму не нашёл темы которая освещала бы то как следует, хотя бы примерно, реализовать обновление той...

29
85 / 77 / 13
Регистрация: 03.09.2009
Сообщений: 346
23.04.2011, 00:03
Студворк — интернет-сервис помощи студентам
r0fL, никогда не проверял, но мне всегда казалось, что при запущенной программе доступ к екзешнику занят.

В общем разобрался с манифестом. Для того, чтобы запустить программу с правами администратора нужно:
1. Добавить свой манифест в проект (Add New Item -> Application Manifest File)
2. В этом манифесте заменить строку "<requestedExecutionLevel level="asInvoker" uiAccess="false" />" на "<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />"
3. Указать в свойствах проекта, что нужно использовать этот созданный файл манифеста
0
Кодило
 Аватар для r0fL
251 / 179 / 23
Регистрация: 25.11.2009
Сообщений: 685
23.04.2011, 07:32
SergBokh, я тоже думал, что занят, пока не занялся вопросом.
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
24.04.2011, 02:00
Так и есть: если приложение запущено, то оно блокирует свой экзэшник.
Кстати, еще один вариант с обновлением: можно, чтоб апдейтер запускай файл не из диска, а читал исполняемый файл в массив байт и запускал приложение уже оттуда. Тогда он спокойной сможет заменять exe-файл программы.
0
 Аватар для HIMen
4340 / 1509 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
24.04.2011, 09:29
Цитата Сообщение от body90 Посмотреть сообщение
а читал исполняемый файл в массив байт и запускал приложение уже оттуда
Антивирусам это не понравится
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
24.04.2011, 12:11
Правду глаголите! Как плохой вариант, можно предупреждать пользователя и говорить, чтоб добавлял в исключения.
0
Кодило
 Аватар для r0fL
251 / 179 / 23
Регистрация: 25.11.2009
Сообщений: 685
24.04.2011, 17:15
Так и есть: если приложение запущено, то оно блокирует свой экзэшник.
странно, у меня все нормально работало так )
0
0 / 0 / 0
Регистрация: 03.11.2011
Сообщений: 7
01.12.2011, 11:01
вы конечно все молодцы, но но покажите пример кода, дано обновить не только саму программу которую запустил, но и часть файлов, а какие файлы список будет лежать в определенном месте на сайте, там же и обновления, как это реализовать, покажите практический пример?
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
01.12.2011, 18:25
Я писал апдейтер для своей проги. Всё работает отлично.

Пишешь прогу апдейтер, в которой делаешь 2 окна. Первое окно это сам апдейтер, второе окно это окно создающее конфигурационный файл. Как по идее это должно работать: Создаёшь отдельную папку от проекта программы, которую будешь апдейтить (программу), кидаешь в созданную папку файлы, которые будут лежать потом на сервере и будут считаться самой последней версией файлов твоей программы. Далее кидаешь в эту папку апдейтер. В апдейтере пишешь (в коде апдейтера), что если передали какой-то аргумент командной строки, то запустить окно редактирования файла конфигурации. Далее у нас в папке находится апдейтер и все нужные для работы проги файлы. Создаёшь ярлык, называешь его _Make (прочерк, чтобы при сортировке файлов виндой этот файл был вверху или внизу (ну мож тебе не нравится сортировка по группам)) в пути к файлу (ярлыка) пишешь: "D:\\путь к проге\Release\Последняя версия на сервере\Updater.exe" make _make.lnk. Далее запускаешь через ярлык апдейтер, он получив параметр открывает окно настройки конфиг файла. Там будет список всех файлов в этой папке. И будет например TextBox для запускаемого файла. Перетаскиваешь с общего списка название эксешника, жмёшь кнопку "Создать конфигурационный файл". В итоге получается что-то типа этого:
Пример конфиг файла
Executable:YourProgramName.exe
Delete:Resources.dll 153905E65A1E10D66E7F5800A2AD324B
File:NewSomeResources.dll 3AB57A33A6E3A1476695D5A6E856C06A
File:sqlceca35.dll 48D3292A287A2454801B923B1166F489
File:sqlcecompact35.dll 01B005BBB9E4C92990B27A06ABD26858
File:sqlceer35EN.dll 88E69D845B1513634AF2FD0E725F9A29
File:sqlceer35RU.dll 9A03537AE71A99FD83177A4E505B89A0
File:sqlceme35.dll 1AC99F626C7B67616123887EABA4780C
File:sqlceoledb35.dll C3BA67167ABFAC31C39BC959B250CED8
File:sqlceqp35.dll 36CCD0CFE3FC326260BAA7425BDE5C9A
File:sqlcese35.dll 958582542E5827C3B1B191F1C6C123F4
File:System.Data.SqlServerCe.dll 85816EAB04B6AE8EB154C962E32D5AC8
File:Updater.exe EC38EF87D53D8BCD22C7560D811AD3A2
File:UpdateUpdater.exe C1F58F3535B88BA0663305BE7348C586


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

Далее у юзера запускается твоя прога. Она проверяет есть ли на сервере конфиг файл, короче пытается его скачать, если скачался, то парсит его и получает коллекцию например:
UpdateFile.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    class UpdateFile
    {
        public string Name { get; private set; }
        public string Hash { get; private set; }
 
        public UpdateFile(string line)
        {
            string[] blocks = line.Split(' ');
            Name = blocks[0];
            Hash = blocks[1];
        }
 
        public override string ToString()
        {
            return Name;
        }
    }


Этот код парсит тот пример файла, что я выложил выше
UpdateConfig.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
    class UpdateConfig
    {
        public List<UpdateFile> Files { get; set; }
        public List<string> FilesToDelete { get; set; }
        public string Executable { get; set; }
        public string ExecutableArgs { get; set; }
 
        public UpdateConfig()
        {
            Files = new List<UpdateFile>();
        }
 
        public UpdateConfig(string config)
        {
            string[] lines = config.Split(new char[] { '\r', '\n' }, System.StringSplitOptions.RemoveEmptyEntries);
 
            FilesToDelete = new List<string>();
 
            Files = new List<UpdateFile>();
            foreach (string line in lines)
            {
                if (string.IsNullOrWhiteSpace(line))
                    continue;
 
                string[] blocks = line.Split(':');
                if (blocks.Length == 2)
                {
                    blocks[0] = blocks[0].ToLower();
 
                    if (blocks[0] == "delete")
                    {
                        if (!string.IsNullOrWhiteSpace(blocks[1]))
                            FilesToDelete.Add(blocks[1]);
                    }
                    else if (blocks[0] == "executable")
                    {
                        if (!string.IsNullOrWhiteSpace(blocks[1]))
                            Executable = blocks[1];
                    }
                    else if (blocks[0] == "executableargs")
                    {
                        if (!string.IsNullOrWhiteSpace(blocks[1]))
                            ExecutableArgs = blocks[1];
                    }
                    else if (blocks[0] == "file")
                    {
                        if (!string.IsNullOrWhiteSpace(blocks[1]))
                            Files.Add(new UpdateFile(blocks[1]));
                    }
                }
            }
        }
 
        public UpdateFile Find(string fileName)
        {
            foreach (UpdateFile file in Files)
                if (file.Name.ToLower().Trim() == fileName.ToLower().Trim())
                    return file;
 
            return null;
        }
    }


Получение хэша файла:
Hash.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    public static class Hash
    {
        static MD5 md5 = new MD5CryptoServiceProvider();
 
        public static string ComputeMD5Checksum(string path)
        {
            using (FileStream fs = System.IO.File.OpenRead(path))
            {
                byte[] fileData = new byte[fs.Length];
                fs.Read(fileData, 0, (int)fs.Length);
                byte[] checkSum = md5.ComputeHash(fileData);
                return BitConverter.ToString(checkSum).Replace("-", String.Empty);
            }
        }
    }


Скачали конфиг файл (в память, не обязательно его сохранять на хард), распарсили, далее сравниваем файлы из коллекции. Если есть отличающиеся файлы, то запускаем апдейтер передав в него id процесса проги и завершаем работу проги, в апдейтере несколько секунд ждём завершение проги, если не завиршилась, то убиваем процесс по id (можно и не делать так). Запускается апдейтер, тоже парсит конфиг файл, получаем коллекцию файлов для апдейта. Для начала удаляем те , которые отмечены под удаление, потом сравниваем хэш с оставшимися, если совпал, то проверяем следующий, если не совпал, то качаем и сохраняем в папку под другим именем, когда удачно скачается то удаляем старый и переименовываем новый под название старого (оригинальное название файла). Так не распишешь всё, надо времени убить просто много и не факт что всё будет ясно. Ну думаю примерно хоть суть понятна. А апдейтер запускать надо с правами администратора, в манифесте правится (тут вроде писали что править надо). Качать файлы проще всего при помощи WebClient, наиболее полезные строки, думаю эти:
C#
1
2
3
4
5
6
7
                WebClient cl = new WebClient();
                cl.UseDefaultCredentials = false;
                //"http://your-server.ru/_files/program_name/update/";
                cl.BaseAddress = ServerManager.SelectUpdaterServer();
                cl.Credentials = null;
                cl.CachePolicy = new System.Net.Cache.RequestCachePolicy(
                   System.Net.Cache.RequestCacheLevel.NoCacheNoStore); //ОБЯЗАТЕЛЬНО!!!
Вариант с ClickOnce не подошёл, так как не разобрался как подменять файлы скомпиленные студией на обработанные обфускатором.
1
0 / 0 / 0
Регистрация: 03.11.2011
Сообщений: 7
01.12.2011, 18:49
для новичка это конечно все сильно, а можно тупо просто пример, программа конектится на сайт читает текстовой файл update.txt и сравнивает цифры от туда и с локального, если на сервере цифра больше, иил локально нету файла update.txt начинается закачка всех файлов из папки к примеру: https://www.cyberforum.ru/update в локальную папку от куда запущено приложение, все в соответствии папка к папке с заменой без подтверждения, и в последную очередь закачивает файл update.txt , файлов в папке думаю будет не много, это конечно не самый лучший вариант, но думаю для меня понятный, пока не осилю все глубины профессионального программирования
для загрузки самого start.exe думаю стоит загружать типо update.exe и после загрузки запустить его для загрузки и замены start.exe и снова запускать start.exe )) как-то так наверное.
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
01.12.2011, 19:06
Ну вот ты сам и попробуй написать. Создай 2 проекта и начинай пробовать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.12.2011, 19:06

Реализация автоматического обновления
Добрый день. мне необходимо реализовать такую вещь: есть выгрузка, которая формирует csv файл и кладёт его в определённое место на фтп....

Наилучшая реализация обновления собственного progressbar
Приветствую. Я создал свой собственный progressbar с рисованием в Compatible DC с битмапом, и копированием всего этого в целевой DC с...

Task Manager C# реализация динамического обновления данных
Скачал исходник индийского программиста и немного не разобрался в синтаксисе, начал менять код и всё поехало... собственно, в чем...

Реализация приложения для обновления резюме сайте
Доброго времени суток! Друзья, я решил написать приложение что-бы обновлять своё резюме на хэдхантаре. Могли бы вы пожалуйста указать...

Обновления программы
Прога должна сделать подмену своего же exe на другой (если конечно она старой версии), который она должна скачать от куда-нибудь (сервера)....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Подсчёт частоты трёхбуквенных слов в тексте
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Выясните, сколько раз в предложенном тексте встречается каждое трехбуквенное слово. Решение: Создан документ с единственным. . .
Сумма и количество положительных элементов в чётных строках массива
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Вычислить сумму и количество положительных элементов массива, расположенных в четных строках. Решение: Создан документ с. . .
Поиск произведения положительных чётных чисел в последовательности
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Дана произвольная последовательность целых чисел. Найти произведение положительных четных чисел данной последовательности. . . .
Обработка трёх чисел: утроение и возведение в степень
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Даны три действительных числа. Утроить те из них, значения которых неотрицательны, и возвести в четвертую степень отрицательные. . . .
Расчёт стоимости яблок по весу
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Написать программу вычисления стоимости некоторого количества (по весу) яблок. Решение: Создан документ, с табличной частью. . .
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни 1. Механизм отложенного высвобождения фосфора Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ Реализована разная скорость. . .
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru