Страницы

Поиск по вопросам

воскресенье, 22 декабря 2019 г.

Замена exe файла при работающем приложении (Автообновление)

#c_sharp


Доброго времени суток.

Есть работающее приложение myapp.exe которое качает с сервера новую версию и кладет
рядом с myapp.exe под именем. myapp.update .

Каким способом можно подменить myapp.exe на новый myapp.exe?

Попытался сделать дополнительный проект.

В конце главный проект выполняет 

Updater.MainWindow update = new Updater.MainWindow();
        update.Show();
        System.Diagnostics.Process.GetCurrentProcess().Kill();


Но окно главного проекта остается открытым но во фризе.

Проект в котором прописан Update не появляться вплоть до последнего действия и тут
же закрывается 

    public MainWindow()
    {
        InitializeComponent();
        Thread.Sleep(5000);
        UpdateNow();
    }

    public  void UpdateNow()
    {
        bool oldapp = false;
        bool newapp = false;
        Changes.Content = "Идет проверка целостности файлов...";

        string path = System.IO.Directory.GetCurrentDirectory();

        string[] allFoundFiles = Directory.GetFiles(path, "myapp.exe");
        foreach (string file in allFoundFiles)
        {
             oldapp = true;
        }

        string[] allFoundFiles1 = Directory.GetFiles(path, "myapp.update");
        foreach (string file in allFoundFiles)
        {
             newapp = true;
        }


        if (oldapp == true && newapp == true)
        {
            Changes.Content = "Все файлы на месте. Идет применение настроек...";
            Thread.Sleep(5000);
            try
            {
                FileInfo fi1 = new FileInfo(path + @"\myapp.exe");
                fi1.Delete();
            }
            catch (Exception ex)
            {
                Changes.Content = ex.ToString();
            }
            try
            {
                System.IO.File.Move(path + @"\myapp.update", path + @"\myapp.exe");
                Changes.Content = "Все готово к работе :)";
                System.Diagnostics.Process.Start(path + @"/myapp.exe");
            }
            catch (Exception ex)
            {
                Changes.Content = ex.ToString();
            }

        }
        else
        {
            Changes.Content = "Что - то не так";
        }
    }
}


Мало того что Update не дает признаков жизни. Появляется ошибка "Отказано в доступе
" при удалении старого myapp.exe . И почему то закрывается само по себе.
    


Ответы

Ответ 1



Например, вы можете написать маленькое приложение, которое скопирует myapp.update в myapp, и запустить его перед выходом из основного приложения. Вспомогательное приложение пускай дождётся, пока основное завершит работу, и потом уже переносит.

Ответ 2



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

Комментариев нет:

Отправить комментарий