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);
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
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()
{
.....
}
}
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é.
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] -> ...
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.
votre deuxième ligne peut être
Updater: Star -> do it's work -> start Application Executable -> Updater Exits -> Application deletes your Updater.exe