typeparam example cref c# .net self-updating self-destruction

cref - summary example c#



AplicaciĆ³n autodesajustable en C#en un ejecutable (7)

¿Es posible hacer una aplicación en C # que pueda borrarse en alguna condición?

Necesito escribir un actualizador para mi aplicación pero no quiero que el ejecutable se quede después del proceso de actualización.

Hay un .Net OneClick oficial, pero debido a algunas incompatibilidades con mi servidor HTTP y algunos problemas de OneClick, me veo obligado a hacer uno.

Jorge.

[EDITAR] En más detalles:

Tengo: Application Executable que descarga el actualizador ("parche", pero no exactamente) este "parche" actualiza el ejecutable de la aplicación.

La aplicación se ejecuta como sigue:

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


¿No podría simplemente eliminar el actualizador desde la aplicación? es decir:

Aplicación: Inicio -> [Eliminar el actualizador anterior si está presente] -> Verificar versión -> Descargar nuevo actualizador -> Iniciar actualizador -> salir;

Actualizador: Inicio -> Realizar actualización -> Iniciar aplicación -> salir;

Aplicación: Inicio -> [Eliminar el actualizador antiguo si está presente] -> ...


Es complicado sin introducir otro proceso (que también querría eliminar, sin duda). En su caso, ya tiene 2 procesos: updater.exe y application.exe. Probablemente, solo tendría la aplicación eliminar updater.exe cuando se genere a partir de ahí, puede usar una línea de comando simple arg, o una llamada IPC de updater.exe a application.exe para activarlo. Eso no es exactamente un EXE que se borra automáticamente, pero creo que cumple con los requisitos.

Para obtener el tratamiento completo y otras opciones, debe leer el tratamiento definitivo de los autoejecutables . Los ejemplos de código están en C (o ASM), pero deben ser p / invokable.

Probablemente probaría FILE_FLAG_DELETE_ON_CLOSE con FILE_FLAG_DELETE_ON_CLOSE para updater.exe con algo como (código 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");

Una vez que sale de application.exe, updater.exe tiene un identificador de archivo 1. Cuando updater.exe se cierra, cae a 0 y debe eliminarse.


Le sugiero que use un archivo de proceso por lotes como bootstrap y haga que se elimine a sí mismo y luego el archivo ejecutable.

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


Mhh así que déjame aclarar esto. ¿Tienes algún application.exe y tu actualizador updater.exe?

Entonces, cuando inicia su aplicación.exe, comprueba algunos servidores web para una versión más reciente y luego inicia updater.exe. ¿Y desea que updater.exe se elimine solo después de que haya finalizado la actualización? ¿O quieres eliminar el parche descargado (o similar)? Por favor sea un poco más preciso.

Tenga en cuenta que cuando elimine updater.exe, debe volver a crearlo para el siguiente proceso de actualización.


Si usa Process.Start, puede pasar el parámetro Del y la ruta a la aplicación que desea eliminar.

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

Fragmento de código tomado de este artículo


tu segunda linea puede ser

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


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

auto eliminar por un archivo ejecutable externo ".bat" para aplicaciones de Windows.