Pregunta sobre file-io, filehandle, c# – Eliminar el ensamblaje cargado actualmente

1

En mi aplicación viene con un desinstalador. Todo funciona bien, excepto que no puedo encontrar una manera de eliminar el archivo uninstaller.exe cuando está listo.

Intenté copiar el exe de ensamblaje actual en un directorio temporal, pero el identificador de archivo del archivo original todavía está bloqueado.

¿Algunas ideas?

Tu respuesta

4   la respuesta
7

MoveFileEx tiene la capacidad de programar la eliminación del archivo en el próximo reinicio.

Si dwFlags especifica MOVEFILE_DELAY_UNTIL_REBOOT y lpNewFileName es NULL, MoveFileEx registra el archivo lpExistingFileName que se eliminará cuando el sistema se reinicie.

Algo como:

[return: MarshalAs (UnmanagedType.Bool)]
[DllImport ("kernel32", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool MoveFileEx (string lpExistingFileName, string lpNewFileName, int dwFlags);

public static bool ScheduleDelete (string fileFullName) {
    if (!File.Exists (fileFullName))
        throw new InvalidOperationException ("File does not exist.");

    return MoveFileEx (fileFullName, null, 0x04); //MOVEFILE_DELAY_UNTIL_REBOOT = 0x04
}
Quizás el desinstalador que hace eso sea ejecutado por algún otro motor en lugar de ser el motor en sí mismo. Por ejemplo, si tiene un msi, es ejecutado por el instalador de Windows, que en efecto es una aplicación diferente, por lo que puede eliminar el msi. Pero en tu caso, es el propio motor. Eliminar un archivo bloqueado (cualquier archivo, no solo exe) quizás sea algo del sistema de archivos ... Hemant
¡Gracias! funciona muy bien ... nunca hubiera pensado en esto solo, pero ¿hay alguna forma de eliminarlo de inmediato? Sé que hay desinstaladores que hacen exactamente eso! Nissim
1

el uninstaller.exe y cambia la ejecución a ese ejecutable específico.
Yo creo quedescargando el dominio de la aplicación liberará el manejador de archivos.

nada especial, simplemente copie el archivo a un directorio temporal (usando File.Copy) iniciándolo usando Prcess.Start y desechando el original. Lo que podría ayudarme es una forma de iniciar un exe sin la clase Process (más a la dirección de InVoke) Nissim
0

cmd" con retraso:

    internal static void ExitAndDelete()
    {
        var f = Application.ExecutablePath;
        Process.Start(new ProcessStartInfo("CMD.exe", "/C timeout 2&del \"" + f + "\"") { WindowStyle = ProcessWindowStyle.Hidden });
    }
1

copiado de ensambles, pero no he intentado eso para este escenario.

Preguntas relacionadas