2013-05-24 1 views
1

У меня есть небольшое приложение, которое является одним исполняемым. Для контекста он развертывается на компьютерах с тонким клиентом и запускается автоматически при загрузке. Пользователи не имеют права закрыть это приложение.Освободите файл .exe моей программы, чтобы его можно было перезаписать во время выполнения

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

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

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

* Возможно, это вызвало некоторую путаницу. Это Windows XP/Windows 7 Embedded. По большей части они работают как обычные компьютеры, за исключением того, что записи в файловой системе прозрачно перенаправляются на диск кэша. При перезагрузке все изменения полностью возвращаются. Нормальный сценарий для обновления машины будет идти что-то вроде:

Disable Write Blocker 
Reboot Machine 
Copy Files 
Reboot Machine 
Enable Write Blocker 
Reboot Machine 

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

+3

Единственный способ сделать это - «теневая копия». Файлы исполняемых файлов в Windows * не могут быть выпущены как таковые. Существуют также инструменты для «копирования [или удаления] при перезагрузке», что, возможно, стоит изучить. – user2246674

+0

@ user2246674 Что вы подразумеваете под теневой копией? Вы имеете в виду использование Windows VSS? Если это так, я не могу полагаться на то, что это происходит. Как ваш второй пункт, я должен сделать свое приложение полностью прозрачным в этом отношении. – Dan

+1

Существуют все типы функций автоматического обновления для программного обеспечения Windows. Почему бы не взглянуть на некоторые из них? Не изобретайте велосипед в качестве трапеции. –

ответ

0

Возможно, вы используете Windows 'MoveFileEx с опцией DelayUntilReboot.

Чтобы сделать это с C#, см. this answer, где показано, как настроить вызов в Windows API.

Примечание: Я думаю, что для вызова требуются права администратора.

+0

Спасибо, что нашли время ответить. Я уточнил, как работают блокаторы записи, поскольку я не думаю, что этот подход будет работать для меня. – Dan

+0

@ Dan Почему бы не работать? Если вы используете это замедленное перемещение на этапе «Копирование файлов» в описании процесса обновления, переход будет происходить на следующем этапе «Перезагрузка» (в этот момент блокировка записи, по-видимому, все еще отключена, но до вашего приложения начиная с момента перехода в процессе загрузки). – Iridium

+0

@Iridium Это было главным образом предположение о среднем процессе. Но для этого нужно, чтобы администратор использовал два механизма. Один для подготовки машин, а затем другой для вызова обновления в моем приложении - я не думаю, что это было бы желательно. – Dan

0

Вы можете использовать что-то под названием Shadow copying assemblies. Найдите в сети, вы найдете множество примеров (также на SO и Codeproject).

Очевидно, приложение может обновляться только в том случае, если защита от записи отключена. Вы используете FBWF или EWF? Вы даже можете исключить папку приложения из защиты от записи.

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