Настраиваемое действие при удалении (однократный щелчок) — в .NET
-
18-09-2019 - |
Вопрос
Для приложения .NET, установленного с помощью ClickOnce, есть ли способ запустить настраиваемое действие во время процесса удаления.
В частности, мне нужно удалить несколько файлов, связанных с приложением (которые я создал при первом запуске), и вызвать веб-службу во время процесса удаления.
Есть идеи?
Решение
С помощью самого ClickOnce сделать это невозможно, но вы можете создать стандартный загрузчик Setup.exe, который устанавливает приложение ClickOnce и имеет настраиваемое действие по удалению.
Обратите внимание, что при этом создаются две записи в разделе «Установка и удаление программ», поэтому вам необходимо скрыть одну из записей (приложение clickonce).
Ваша последняя проблема будет заключаться в том, что при однократном щелчке нет опции «тихое удаление», поэтому вы можете сделать что-то вроде этого:
On Error Resume Next
Set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run "taskkill /f /im [your app process name]*"
objShell.Run "[your app uninstall key]"
Do Until Success = True
Success = objShell.AppActivate("[your window title]")
Wscript.Sleep 200
Loop
objShell.SendKeys "OK"
(Найденный здесь)
Другие советы
ClickOnce устанавливает ключ реестра Uninstall в HKEY_CURRENT_USER, который доступен вашему приложению ClickOnce.
Конкретное местоположение: «HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall».
Вам придется искать ключ по отображаемому имени вашего приложения.
Затем вы можете завершить обычное действие удаления,
string registryKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
Microsoft.Win32.RegistryKey uninstallKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(registryKey);
if (uninstallKey != null)
{
foreach (String a in uninstallKey.GetSubKeyNames())
{
Microsoft.Win32.RegistryKey subkey = uninstallKey.OpenSubKey(a, true);
// Found the Uninstall key for this app.
if (subkey.GetValue("DisplayName").Equals("AppDisplayName"))
{
string uninstallString = subkey.GetValue("UninstallString").ToString();
// Wrap uninstall string with my own command
// In this case a reg delete command to remove a reg key.
string newUninstallString = "cmd /c \"" + uninstallString +
" & reg delete HKEY_CURRENT_USER\\SOFTWARE\\CLASSES\\mykeyv" +
MYAPP_VERSION + " /f\"";
subkey.SetValue("UninstallString", newUninstallString);
subkey.Close();
}
}
}