Итак, существует «некрасивый хак», который решает точную проблему:
Во-первых, нам нужен исполняемый файл, на который не влияет установщик.Это просто, мы просто копируем этот установленный exe-файл в каталог TEMP
и запускаем его оттуда.
Следующим шагом является то, что файл должен ждать, пока не завершится фаза удаления.Есть несколько способов сделать это.Вы можете наблюдать за процессом установки, вы можете наблюдать за файловой системой, если основной файл программы удален.Учитывая скорость обычных операций установщика, опрос один раз в секунду является достаточно хорошим вариантом.
Следующий шаг не является обязательным - вы удаляете оставшиеся файлы, созданные приложением, пустые каталоги и т. Д.
Следующим шагом является сама перезагрузка, MessageBox.Show()
из PresentationFramework
нормально спрашивать пользователя, когда пользователь отвечает ОК или ДА, тогда саму перезагрузку можно выполнить разными способами, я использую ExitWindowsEx()
из user32.dll
, поскольку, вероятно, это msiexec
вызывает внутренне.
Вот пример кода:
if (MessageBox.Show(RestartPromptMsg, "", MessageBoxButton.OKCancel, MessageBoxImage.Exclamation) == MessageBoxResult.OK) {
NativeMethods.ExitWindowsEx(
NativeMethods.Flags.Reboot,
NativeMethods.Reason.MajorApplication | NativeMethods.Reason.MinorInstallation | NativeMethods.Reason.FlagPlanned
);
}
Конечно, некоторые параметры могут быть переданы нашему специальному исполняемому файлу очистки, поэтому он может выполнять некоторые дополнительные действия, такие как пропуск перезапускаподскажите, если это действительно не требуется.
Последний шаг - удалить сам исполняемый файл.Это легко, но сложно.Опять же, я надеюсь, что мой пример кода поможет:
var cleanUpTempPath = Path.Combine(Path.GetTempPath(), CleanUpExe);
File.Copy(CleanUpPath, cleanUpTempPath, overwrite: true);
Process.Start(new ProcessStartInfo {
FileName = "cmd",
Arguments = $"/c (\"{cleanUpTempPath}\" -purge \"{InstallerDir}\") & (del \"{cleanUpTempPath}\")",
UseShellExecute = false,
CreateNoWindow = true
});
Мы используем cmd.exe
специальную функцию, мощность &
и ()
.Команды, разделенные &
, выполняются при выходе из предыдущей команды.Таким образом, когда наш clen up exe завершается, он удаляется тем же экземпляром cmd
, который его вызвал.Не забудьте процитировать все пути, они могут содержать пробелы.Не забудьте заключить команду с аргументами в скобки, потому что в противном случае оператор &
будет рассматриваться как параметр предыдущей команды, а не cmd.exe
.
. Я тестировал ее в своем большом производственном приложении, и онработает как шарм.Примеры кода не работают, когда их просто вставляют, если вы ищете полный код, просто найдите его в Google, существует множество рабочих примеров на pinvoke.net и StackOverflow.