2012-01-20 2 views
19

Пусковые установки чаще всего встречаются в играх. Подумайте о Лиге Легенд, Starcraft II или почти любой MMO. Перед началом реальной игры у вас есть небольшое приложение для запуска, которое заботится о обновлениях и исправлениях.Как само приложение запускает обновление?

Я хочу двигаться в этом направлении с помощью определенного не-игрового приложения, которое я разрабатываю. Концепция пусковой установки имеет прекрасный смысл: она проверяет наличие обновлений, заменяет соответствующие бинарные файлы/библиотеки, может запускать проверку целостности и запускает приложение. Однако, как пусковые установки обновляют себя? Это, как правило, редкое событие, но как это делается? Разве пусковая установка буквально просто пишет по самой двоичной системе, из которой она сейчас работает? Или есть какой-то шаг подкачки после загрузки? Мне нужно иметь возможность выталкивать (редкие) обновления для запуска (особенно, если я обнаруживаю ошибку в моей пусковой установке).

Мой конкретный проект будет в C#, но меня интересуют концептуально похожие C++ и/или Java-решения, а также для дальнейшего использования.

+1

Как только программа загружается в память, на самом деле не стоит заботиться о том, что происходит с бинарным файлом изображения, откуда вы пришли, поэтому вам должно быть позволено перезаписать это. Тогда все, что вам нужно сделать, это перезапустить программу, возможно, с чем-то вроде 'exec'. –

+0

@ KerrekSB Звучит достаточно просто. Тем не менее, я все еще немного нечеткий. Итак, запустите программу в отдельном процессе, а затем просто выйдите из нее? – TheBuzzSaw

+5

@KerrekSB, Windows блокирует исполняемый файл во время его работы. Частично потому, что некоторые разделы могут не загружаться сразу. –

ответ

5

Я никогда не пробовал, но это то, что я думаю (если вы не можете перезаписать файл выполняется. Если вы можете, это все проще)

Updater A checks if its the newest version 
If launcher isnt the newest version 
    Download the differences (to save bandwidth) to file B 
    Apply the delta to own code into file C 
    Launch file C. 
    Close 
If file C exists (update happened recently) 
    Try to delete C (update was previous launch, delete temporary file) 
    If delete fails (We are C, means A is out of date) 
     Copy C over A (update launcher) 
     Note that you can keep going, don't have to restart even though we are C. 
If game isnt newest version 
    Download the differences (to save bandwidth) to file B 
    Apply the delta to game into file D 
    delete game 
    Rename D -> game 
Run game 

André Caron показал мне, что трюк с обменом сделан лучше с transactional file IO.

+0

Это определенно дает мне некоторые идеи. Я сейчас обдумываю их в голове. – TheBuzzSaw

+0

Если соединение нарушено? –

+1

@GaryVass: Я думал, что временные файлы позаботились об этом. Вы видите недостаток в моем проекте где-то? Все загрузки относятся к отдельному файлу 'B' до завершения, а затем применяются к другому файлу' C'/'D' до завершения до его выполнения. –

2

Если вы находитесь в мире .NET, существует стратегия развертывания под названием «Click Once». Это было создано для решения проблемы, которую вы описали ...

ClickOnce - это технология развертывания, которая позволяет создавать самообновляющиеся приложения на базе Windows, которые можно устанавливать и запускать с минимальным пользовательским взаимодействием. Развертывание ClickOnce преодолевает три основные проблемы, присущие развертывания:

Источник: Click Once

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

Вкратце, вы загружаете новые версии на веб-сайт (о котором приложение настроено, чтобы знать). Во время запуска приложение проверяет сайт и, если есть обновление, предлагает пользователю диалог. Когда пользователь выбирает приложение для обновления, приложение останавливается и одновременно активируется компонент «щелчок один раз» для применения изменений. Компонент затем перезапускает исполняемый файл, и все это выглядит как плавная операция для конечного пользователя ...

+2

Спасибо, что поделились этим. Я посмотрю на ClickOnce, но меня все еще интересуют прямые решения на основе кода. Я хотел бы понять процесс концептуально, должен ли я когда-либо сам его кодировать. – TheBuzzSaw

+1

Я думаю, что OP искал методы, используемые для реализации таких систем. Это не объясняет, как достигается обновление пусковой установки. Вы все равно должны как-то обновить «Click Once». Если он автоматически обновляет себя, то, может быть, вы могли бы уточнить, как это достигается? –

+0

@ AndréCaron, ссылка дает очень четкое объяснение того, как пусковая установка обновляет себя. Я предлагаю прочитать его, а затем вернуться с любыми оставшимися вопросами у вас есть –

1

В основном программа запуска проверяет, есть ли ее более новая версия, и если это так начинается с задачи, чтобы получить новую версию, а затем выполняет ее, а затем закрывает.

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

 Смежные вопросы

  • Нет связанных вопросов^_^