jokler.007 Ответов: 4

Загрузите и замените запущенный EXE файл


Всем привет,

Можем ли мы запустить приложение .exe, которое загружает другой файл .exe с сервера и заменяет его текущим ? в c#.
Есть примеры ?

Заранее спасибо.

johannesnestler

Вы имеете в виду своего рода обновление для вашего приложения (включает в себя проверку версии)?

jokler.007

Да что то похожее

xenotron

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

4 Ответов

Рейтинг:
9

johannesnestler

Привет, джоклер.007,

Я думаю, что ответ Джонни Джея хорош и поможет вам с соответствующими шагами.

Это зависит от ваших потребностей, что вы должны сделать, чтобы получить хороший пользовательский опыт. Подумайте о том, чтобы не сворачивать свое собственное решение, а использовать готовые решения для развертывания, такие как ClickOnce, в которые включен updater.

Если вы хотите создать свою собственную "систему", возможно, Вам будет полезно услышать то, что я сделал:

Updater.exe это началось из моего Target.exe (приложение для Windows)
Updater.exe заканчивается Target.exe (или ждет завершения, если Target.exe закрылась сама собой)
Updater.exe поиск возможных обновлений в источниках обновлений (configurabale) (local, Network, Internet)
Если найдены источники обновления Updater.exe делает проверку версии - если доступна более новая версия.
Если была найдена более новая версия, загрузите/скопируйте ее как новую Target.exe
Updater.exe старты Target.exe снова и закрывается сама.

Конечно, можно было бы взять много других "маршрутов" - просто пример.

У моего решения было несколько ключевых моментов - возможно, код помогает/вдохновляет вас:

Дождитесь завершения процесса

static bool WaitForProcessExit(string strProcessName, int iWaitTime)
        {
            Process[] aProcs = Process.GetProcessesByName(strProcessName);
            // Ist der Prozess noch aktiv?
            if (aProcs != null && aProcs.Length > 0)
            {
                // ... Wenn ja, auf Beenden warten.
                return aProcs[0].WaitForExit(iWaitTime);
            }

            return true;
        }


сравнение сборочных версий файлов для обновления без их загрузки:

static Version GetVersionFromAssemblyFullName(string strAssemblyPath)
 {
     string strVersion = AssemblyName.GetAssemblyName(strAssemblyPath).FullName.Split(",".ToCharArray())[1].Split("=".ToCharArray())[1];
     return new Version(strVersion);
 }


Version versionNew = GetVersionFromAssemblyFullName(strNewAssemblyPath);
                            Version versionOld = GetVersionFromAssemblyFullName(strCurrentAssemblyPath);

                            if (versionNew > versionOld)
...


привет Йоханнес


Рейтинг:
36

Johnny J.

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

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

Это можно сделать с помощью раздела реестра RunOnce:

http://stackoverflow.com/questions/7483230/how-can-i-run-an-app-automatic-after-restart[^]

Что касается загрузки файла: используйте объект WebClient:

http://msdn.microsoft.com/en-us/library/ez801hhe.aspx[^]

http://www.csharp-examples.net/download-files/[^]


jokler.007

Большое спасибо.

Рейтинг:
2

Avram Grossman

Ну на самом деле есть способ заменить исполняемый файл из самого себя.
Я обнаружил это много лет назад.

Хотя вы не можете удалить текущий исполняемый файл программы .exe, вы можете переместить его!!!

Итак, сначала я загружаю файл обновления со своего веб-сервера на /updates/myprogram.exe

потом я
1) файл.Удалите все предыдущие файлы myprogram.bak
2) файл.Переместите myprogram.exe к моей программе.бак.
3) файл.Скопируйте /updates/myprogram.exe чтобы /myprogram.exe местоположение.
4) спросите пользователя, хотят ли они перезапустить приложение, вызывая его.Перезапуск()

Вот. Проблема решена в вашей основной программе. Нет необходимости в загрузочной программе. файл.Команда перемещения-это секрет!!! Он в основном переименовывает исполняемый файл в имя файла резервной копии.


Andrew-Suffolk-UK

Блестяще - получил эту работу сам в бесформенном приложении vb. Единственная трудность заключалась в том, что предыдущие "свойства/детали", просматриваемые в Win-Explorer, похоже, были приняты новым exe, если вы делаете весь процесс в одной папке - дополнительный этап (2a) удаления .Exe решил и эту проблему.

Рейтинг:
16

Dineshshp

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

для этого вы можете использовать следующий API :

[Flags]
enum MoveFileFlags
{
 MOVEFILE_REPLACE_EXISTING = 0x00000001,
 MOVEFILE_COPY_ALLOWED = 0x00000002,
 MOVEFILE_DELAY_UNTIL_REBOOT = 0x00000004,
 MOVEFILE_WRITE_THROUGH = 0x00000008,
 MOVEFILE_CREATE_HARDLINK = 0x00000010,
 MOVEFILE_FAIL_IF_NOT_TRACKABLE = 0x00000020
}

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
static extern bool MoveFileEx(string lpExistingFileName, string lpNewFileName, MoveFileFlags dwFlags);



// How to use

MoveFileEx(__source, __destination, MoveFileFlags.MOVEFILE_DELAY_UNTIL_REBOOT | MoveFileFlags.MOVEFILE_REPLACE_EXISTING);


johannesnestler

приятно знать - Спасибо.