Pull to refresh

Comments 31

А чем технология ClickOnce не устроила? Не проще было использовать проверенное решение? Ваше решение абсолютно не безопасно и ни в коем случае не подходит для банков или любого более-менее серьёзного применения.
Зашел оставить или прочитать этот комментарий. ClickOnce прост и в то же время может служить отправной точкой для запуска более сложных сценариев.
Тоже первая же мысль про ClickOnce.
Цифровые сертификаты, цифровые подписи разворачиваемого дистрибутива, подпись разработчика приложения, контроль целостности? Ну можно было сделать намного качественнее и проще, используя публикацию с применением технологии ClickOnce c созданием манифеста развёртывания приложения.
Скажу честно, что до сих пор не был знаком с технологией ClickOnce.
По поводу проверки целостности скачанной программы — это, конечно же, будет сделано, просто решил не загромаждать проект дополнительными возможностями, чтобы сконцентрироваться на основной идее.
Согласен, что для серьёзных проектов такой вариант не годится, но для внутренних офисных программ внутри корпоративной сети, думаю, вполне сгодится.
UFO landed and left these words here
Чем вас не устраивает изобретение велосипеда?

Зато теперь человек знает не понаслышке как это сделать, углубился внутрь процесса, не используя готовое решение.
Как минимум достойно похвалы.
Омаху нужно еще не хило так докрутить.
Добавить win8, прорубить про недокументированные вызовы к API, реализовать эти API.

На бумаге всё красиво, на деле есть некоторые шероховатости.
Как вариант — использовать NuGet. Поднимаете собственную галерею и вперед…
И как это будет работать с UAC?

Еще можно использовать планировщик заданий для проверки и установки обновлений.
Кстати это очень удобно! Сейчас поднимаем собственную галлерею как раз. При учете, что можно повершелом ставить из галереи и без студии, получается вообще красота.
Начал отвечать про галерею, потом посмотрел про UAC и поменял коммент.
Насчет галереи — развернули собственную, довольно удобно при модульной разработке с учетом того что модули могут писать и партнеры.
Статья понравилась. Велосипед годный. Вышеуказанный замечания по поводу безопасности, конечно, справедливы.

Сам бы так не стал реализовывать, если делал бы именно велосипед. Смотрите: у вас апдейтер (который перекопирует файлы) — это сама программа (тот же exe файл). Можно бы было сделать 2 отдельных приложения:

1) программа, которая умеет скачивать новую программу и запускать апдейтер
2) программа апдейтер, которая не изменяется никогда

Таким образом, ключей запуска бы не потребовалось вообще.
Если вдруг понадобиться изменить логику апдейтера из пункта 2), то можно в пункте 1 скачивать логику апдейтера в dll. еxе файл же меняться не будет.
У меня уже была реализация с двумя файлами, и всё работало прекрасно в проекте VKInfinity, который уже, к сожалению, закрыт. Но размещать на сайте два файла для запуска приложения без инсталляции — не удобно. Использовать архиватор специально ради этого тоже не гуд. Поэтому я хотел сделать всё именно в одном файле.
Спасибо за отзыв!
Мы решили этот вопрос следующим образом: пользователю отдавали только модуль обновления. При запуски он проверял, что основной программы нет и загружал ее. Мы да же больше извращались, так как для работы модуля обновления нужны были сторонние библиотеки (7z), мы их включали в модуль как ресурс, при первом запуске распаковывали в файлы, перезапускали обновлятор и тащили основное приложение, но все это не будет работать с UAC. Планировщик заданий тоже не помог так, как у нас модуль взаимодействовал с пользователем (выдавал уведомления), а программа запущенная из под админа, не взаимодействует с текущим рабочим столом пользователя. Помогла только служба — она решила все наши проблемы.
UFO landed and left these words here
Нет, алгоритм расположен в отдельном классе, у него своя форма.
См. самый первый рисунок в начале статьи, в правой части видно, что есть две формы:
основная Form1.cs и форма для модуля обновления FormUpdater.cs.

Также посмотрите листинг файла Program.cs — основная форма запускается только после того, как модуль обновления дал «добро».
Извините, не до конца понял вопрос. Да, алгоритм внутри класса формы, хоть и отдельной, специально для этого созданной.
Делал я когда-то схожий велосипед. Пришел даже к тому, чтобы использовать GDIFF. Но со временем оказалось, что проще скачать инсталятор (например, на основе MSI) в Temp директорию, и запустить его с verb runas и /silent, и тут же закрыть программу.

Полностью согласен,
Мой алгоритм — скачиваем дистрибутив локально (%appdata%\projectname)
Если меньше 5 мегабайт — то скачиваем и обновляем сразу, если больше скачиваем в бекграунде (последнее время стал использовать BITS) потом запускаем.
Для обновления использую bat файл — его можно сгенерировать из программы или сразу положить в дистрибутив, в него дописываю путь программы которую нужно запустить после обновления.
Запускаем его в скрытом режиме + verb runas


start /wait test.msi /passive
notepad
Запускаем процесс инсталляции и ждем его завершения, выводим только прогресс инсталляции


плюсы решения:
можно еще что-нибудь запустить, например патч которые локальные базы подправит/допишет поля и тд.
Целостность установки не повреждается, т.е если дописывать какие нибудь дополнительные файлы после инсталляции при ее удалении они останутся в системе, что ни есть гуд.
Ну и с переименованием основной программы не нужно заморачиваться — на практике понял что нельзя предусмотреть все ситуации на 100 %.
Если нужно удаляю скаченный дистр в том же батнике.

Сделал такой же велосипед для всех своих программ, единственное что я храню на сервере не файл а архив, потому как бывает что обновить надо и дополнительные файлы (шаблоны для отчета, файлы настроек и т.д.). Но большая проблема возникает на компьютерах с ограниченным доступом где в целевой папке запрещается что-либо изменять, ничего не придумал лучше кроме как установить программу в личную папку пользователя.
P.S. Правда я еще сделал «админку» в некоторых программах для заливки архива с обновлением и изменением текстовика с номером версий на сервер через FTP. Удобнее стало.
image
Спасибо за идею, я тоже так сделаю, чтобы загрузка обновления с изменением файла версии представляло собой одну транзакцию.
Евгений, я конечно извиняюсь, но:
private string get_exec_filename()
    {
        string fullname = Application.ExecutablePath; 
        // Например: D:\Work\Projects\Name.exe
        string[] split = { "\\" };
        string[] parts = fullname.Split(split, StringSplitOptions.None);
        // Получим массив из 4 элементов: D: , Work , Projects , Name.exe

        if (parts.Length > 0)
            return parts[parts.Length - 1]; // Последний элемент = искомое имя файла
        return "";
    }

можно заменить на
Path.GetFileName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName)

, ну и еще половину кода так же.
Вот! Я ждал этот комментарий! Большое спасибо за совет.
Не за что, если что спрашивайте, с удовольствием отвечу на Ваши вопросы
Не сразу понял что это C#.
Почитайте что ли гайды по coding style для языка на котором пишете. (вот один из вариантов — www.rsdn.ru/article/mag/200401/codestyle.XML)
Это просто невыносимо выглядит, вас видимо спасает что вы не в разработке работаете, а где то в «АЙТИ Отделе ООО Рога и Копыта».

Хотя диаграмма у вас очень красиво нарисована (о полезности говорить не буду).
UPD: Мне так понравилось делать описание собственных программ, что я пошёл дальше, стал записывать обучающие видео по созданию простеньких программок, что в конечном итоге вылилось мой собственный авторский проект — практические видео-курсы по программированию на C# для начинающих.
Если кому интересно — www.videosharp.info/
Sign up to leave a comment.

Articles