Подтвердить что ты не робот

Самостоятельное удаление приложения на С# в одном исполняемом файле

Возможно ли сделать приложение на С#, которое сможет удалить себя в каком-либо состоянии.

Мне нужно написать программу обновления для моего приложения, но я не хочу, чтобы исполняемый файл оставался после процесса обновления.

Существует официальный .Net OneClick, но из-за некоторых несовместимостей с моим HTTP-сервером и некоторых проблем с OneClick я вынужден сам сделать это.

Джордж.

[EDIT] Более подробно:

У меня: Приложение Executable, которое загружает обновление ( "patch", но не совсем), этот "патч" обновляет сам исполняемый файл приложения.

Приложение выполняется следующим образом:

Application: Start -> Check Version -> Download new Updater -> Start Updater -> exit;
Updater: Start -> do it work -> start Application Executable -> self delete (this is where I get stuck);
4b9b3361

Ответ 1

Если вы используете Process.Start, вы можете передать параметр Del и путь к приложению, которое вы хотите удалить.

ProcessStartInfo Info=new ProcessStartInfo();
Info.Arguments="/C choice /C Y /N /D Y /T 3 & Del "+
               Application.ExecutablePath;
Info.WindowStyle=ProcessWindowStyle.Hidden;
Info.CreateNoWindow=true;
Info.FileName="cmd.exe";
Process.Start(Info); 

Фрагмент кода, взятый из в этой статье

Ответ 2

Я предлагаю вам использовать пакетный файл в качестве начальной загрузки и удалять его и exe впоследствии

public static class Updater
{
    public static void Main() 
    {   
        string path = @"updater.bat";

        if (!File.Exists(path)) 
        {
            // Create a file to write to.
            using (StreamWriter sw = File.CreateText(path)) 
            {
                sw.WriteLine("updater.exe");
                sw.WriteLine("delete updater.exe /y");
                sw.WriteLine("delete updater.bat /y");
            } 

            System.Process.Start(path);   
        }
        else
        {
            RunUpdateProcess();
        }
    }

    private void RunUpdateProcess()
    {
        .....
    }
}

Ответ 3

Это сложно, не представляя еще один процесс (который вы также хотели бы удалить, без сомнения). В вашем случае у вас уже есть 2 процесса - updater.exe и application.exe. Вероятно, я просто попробовал бы приложение updater.exe, когда оно появилось оттуда - вы могли бы использовать простую командную строку arg или вызов IPC из updater.exe в application.exe, чтобы вызвать его. Это не совсем само удаление EXE, но выполнение требований, которые я думаю.

Для полного лечения и других вариантов вы должны прочитать окончательное лечение самостоятельного удаления EXE. Образцы кода находятся в C (или ASM), но должны быть p/invokable.

Я бы, вероятно, попробовал CreateFile с FILE_FLAG_DELETE_ON_CLOSE для updater.exe с чем-то вроде (psuedo code):

 var h = CreateFile(
            "updater.exe", 
            GENERIC_READ | GENERIC_WRITE, 
            FILE_SHARE_DELETE, 
            NULL, 
            CREATE_NEW, 
            FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE
         );

 byte[] updaterBytes = GetUpdaterBytesFromWeb();
 File.WriteAllBytes("updater.exe", updaterBytes);

 Process.Start("updater.exe");

Когда приложение application.exe завершает работу, updater.exe имеет дескриптор файла 1. Когда updater.exe завершает работу, он падает до 0 и его следует удалить.

Ответ 4

Не могли бы вы просто удалить программу обновления из приложения? то есть:.

Приложение: Пуск → [Удалить старый обновитель, если присутствует] → Проверить версию → Загрузить новый обновитель → Запустить программу обновления → exit;

Обновление: Пуск → Выполнить обновление → Запустить приложение → exit;

Приложение: Пуск → [Удалить старый обновитель, если присутствует] → ...

Ответ 5

Mhh, так позвольте мне понять это прямо. У вас есть приложение application.exe и приложение updater.exe для обновления?

Поэтому, когда вы запускаете приложение application.exe, он проверяет некоторый веб-сервер для более новой версии и затем запускает updater.exe. И вы хотите, чтобы updater.exe удалил себя после завершения обновления? Или вы хотите удалить загруженный патч (или аналогичный)? Пожалуйста, будьте более точными.

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

Ответ 6

Ваша вторая строка может быть

Updater: Star -> do it work -> start Application Executable -> Updater Exits -> Application deletes your Updater.exe

Ответ 7

public void uninstall() {
    string app_name = Application.StartupPath + "\\" + Application.ProductName + ".exe";
    string bat_name = app_name + ".bat";

    string bat = "@echo off\n"
        + ":loop\n"
        + "del \"" + app_name + "\"\n"
        + "if Exist \"" + app_name + "\" GOTO loop\n"
        + "del %0";

    StreamWriter file = new StreamWriter(bat_name);
    file.Write(bat);
    file.Close();

    Process bat_call = new Process();
    bat_call.StartInfo.FileName = bat_name;
    bat_call.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    bat_call.StartInfo.UseShellExecute = true;
    bat_call.Start();

    Application.Exit();
}

самостоятельно удалять внешним исполняемым файлом ".bat" для приложений форм Windows.