Переименуйте исполняемый исполняемый файл (exe)

Мы пытаемся загружать обновления сразу на несколько серверов, и мой менеджер обнаружил, что можно переименовать запущенный файл.exe. Используя эти знания, он хочет переименовать работающий exe-файл и скопировать новую версию указанного exe-файла, чтобы любой, кто запускает свою копию foo.exe в памяти, был в порядке, и любой, кто откроет ярлык, указывающий на foo.exe, получит новую копию с обновления применены.

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

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

Мой первый и главный вопрос: допустимо ли это когда-либо делать? Должно ли переименование работающего исполняемого файла когда-либо быть допустимым сценарием?

Во-вторых, если это правильный сценарий, то как можно надежно это сделать? В настоящее время мы пытаемся несколько раз использовать File.Move (C#) для переименования, и если это не сработает, запишите в журнал ошибок, чтобы его можно было обработать вручную.

4 ответа

Механик самолета и хирург встречаются в баре. Механик говорит: "Вы знаете, у нас в основном та же самая работа. Мы вынимаем сломанные вещи и вставляем новые, лучшие детали". Хирург говорит: "Да, но вам не нужно держать самолет летящим, пока вы делаете ремонт!"

Попытка обновить приложение путем перемещения файлов во время его работы кажется такой же опасной, как попытка починить самолет в полете. Возможный? Конечно. Значительно повышен риск катестрофического сбоя? Ага.

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

  1. Нет, это не приемлемо. Не делайте этого. Это недопустимый механизм развертывания. Это должна была быть ваша или его первая подсказка:

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

    И все равно это не сработает. Его теория совершенно неверна:

    Используя эти знания, он хочет переименовать работающий exe-файл и скопировать новую версию указанного exe-файла, чтобы любой, кто запускает свою копию foo.exe в памяти, был в порядке, и любой, кто откроет ярлык, указывающий на foo.exe, получит новую копию с обновления применены.

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

    Обратите внимание, что даже современные веб-браузеры, такие как Chrome и Firefox с их сверхъестественным автоматом, в фоновом режиме, никто не замечает их существования, средства обновления все равно должны закрывать и перезапускать приложение, чтобы применить обновления.

    Не беспокойся насчет стрельбы в мессенджера. Скорее всего, ваши клиенты и ваш отдел технической поддержки пристрелят вас первыми.

  2. Смотрите номер 1.

В нашей организации мы решили проблему обновлений с помощью двух папок выпуска, таких как EXE_A и EXE_B. У нас также есть папка релиза с именем EXE, в которой есть только ссылки, ВСЕ из которых указывают либо на EXE_A, либо на EXE_B, из которого пользователь запускает приложения.

Когда мы публикуем новую версию программы, мы публикуем ее в папку, на которую нет ссылок в ссылках, а затем обновляем ссылки (EXE). Таким образом, вы не попадете в исключения, когда пользователи удерживают приложение / сборки. Также, если пользователь хочет запустить обновленную версию, все, что ему нужно сделать, это закрыть / повторно выполнить ссылку в папке EXE.

Если вы используете Windows Vista/Server2k8 или новее, вы можете использовать mklink создать символическую ссылку на папку, содержащую ваше приложение, и запустить приложение из "папки с символьными связями", а затем при обновлении создать новую папку, например "AppV2", и изменить SymLink на эту папку, поэтому в следующий раз Пользователь перезапускает приложение, которое он запускает из новой папки, не замечая этого.

Переименование открытых файлов ВСЕГДА плохой выбор!

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

Другие вопросы по тегам