Вопрос по c#, file-io – Удалить загруженную сборку

1

В мое приложение входит деинсталлятор. Все работает нормально, за исключением того, что я не могу найти способ удалить файл uninstaller.exe, когда все это будет сделано.

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

Есть идеи?

Ваш Ответ

4   ответа
0

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

MoveFileEx имеет возможность запланировать удаление файла при следующей перезагрузке.

If dwFlags specifies MOVEFILE_DELAY_UNTIL_REBOOT and lpNewFileName is NULL, MoveFileEx registers the lpExistingFileName file to be deleted when the system restarts.

Что-то вроде:

[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
}
Спасибо! прекрасно работает ... никогда бы не подумал об этом сам, но есть ли способ удалить его сразу? Я знаю, что есть деинсталляторы, которые делают именно это! Nissim
Возможно, деинсталлятор, который делает это, исполняется каким-то другим движком, а не самим движком. Например, если у вас есть MSI, она выполняется установщиком Windows, который, по сути, другое приложение, поэтому он может удалить MSI. Но в вашем случае это сам двигатель. Удаление заблокированного файла (любого файла, не только exe), возможно, будет проблемой файловой системы ...
1

если бы вы опубликовали некоторый код того, как именно вы копируете uninstaller.exe и меняете выполнение на этот конкретный исполняемый файл.
Я думаювыгрузка домена приложения освободит дескриптор файла.

ничего особенного, просто скопируйте файл во временный каталог (используя File.Copy), запустив его с помощью Prcess.Start и избавившись от оригинала. Мне может помочь способ запуска exe без класса Process (больше в направлении PInvoke) Nissim
1

теневое копирование сборок, но я не пробовал это для этого сценария.

Похожие вопросы