web-dev-qa-db-fra.com

Application auto-supprimable en C # dans un exécutable

Est-il possible de faire une application en C # qui pourra se supprimer dans certaines conditions.

Je dois écrire un programme de mise à jour pour mon application, mais je ne veux pas que l'exécutable reste après le processus de mise à jour.

Il existe un fichier .Net OneClick officiel, mais en raison d'incompatibilités avec mon serveur HTTP et de problèmes liés à OneClick lui-même, je suis obligé de le créer moi-même.

George.

[EDIT] Plus en détail:

J'ai: Application Executable qui télécharge le programme de mise à jour ("patch", mais pas exactement). Ce "patch" met à jour l'exécutable de l'application.

L'application s'exécute comme suit:

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

Si vous utilisez Process.Start, vous pouvez passer le paramètre Del et le chemin d'accès à l'application que vous souhaitez supprimer. 

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); 

Extrait de code tiré de cet article

33
James

Je vous suggère d'utiliser un fichier batch comme un bootstrap et de le supprimer lui-même et l'exe après

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()
    {
        .....
    }
}
9
Emre Aydinceren

C'est délicat sans introduire un autre processus (que vous voudriez alors également supprimer, sans aucun doute). Dans votre cas, vous avez déjà 2 processus - updater.exe et application.exe. J'aurais probablement juste l'application supprimer updater.exe lorsqu'elle sera générée à partir de là. Vous pourriez utiliser un simple argument de ligne de commande ou un appel IPC de updater.exe à application.exe pour le déclencher. Ce n'est pas exactement un fichier EXE à auto-suppression, mais il répond aux exigences que je pense.

Pour le traitement complet et les autres options, vous devriez lire le traitement définitif des fichiers EXE à auto-suppression . Les exemples de code sont en C (ou ASM), mais doivent être p/invocables.

J'essaierais probablement CreateFile avec FILE_FLAG_DELETE_ON_CLOSE pour updater.exe avec quelque chose comme (code psuedo):

 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");

Une fois que application.exe est sorti, updater.exe a un handle de fichier de 1. Lorsque updater.exe est quitté, il tombe à 0 et doit être supprimé.

5
Mark Brackett

Ne pourriez-vous pas simplement supprimer le programme de mise à jour à partir de l'application? c'est à dire.:

Application: Démarrer -> [Supprimer l'ancien programme de mise à jour le cas échéant] -> Vérifier la version -> Télécharger le nouveau programme de mise à jour -> Démarrer le programme de mise à jour -> quitter;

Updater: Démarrer -> Effectuer la mise à jour -> Démarrer l'application -> quitter;

Application: Démarrer -> [Supprimer l'ancien programme de mise à jour, le cas échéant] -> ...

3
Eamon Nerbonne

Mhh, alors laisse-moi bien comprendre. Vous avez une application.exe et votre application de mise à jour updater.exe?

Ainsi, lorsque vous démarrez votre application.exe, il recherche une version plus récente sur le serveur Web, puis lance updater.exe. Et vous voulez que updater.exe se supprime lui-même une fois la mise à jour terminée? Ou voulez-vous supprimer le patch téléchargé (ou similaire)? S'il vous plaît soyez un peu plus précis.

Notez que lorsque vous supprimez updater.exe, vous devez le recréer pour le prochain processus de mise à jour.

0
chrischu

votre deuxième ligne peut être 

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