Удаление приложения во время установки не работает
Я разрабатываю приложение WPF на С#. В настоящее время мой msi устанавливает текущее приложение в machine.I нужно удалить два поддерживающих приложения существующей версии во время установки нового (msi).
Я написал код, чтобы программно удалить приложение, и это не работает, когда я вызываю метод удаления приложения в installer.cs
. Тот же метод успешно удаляет два приложения, когда я вызываю из другой части проекта, кроме installer.cs
.
метод удаления:
public static string GetUninstallCommandFor(string productDisplayName)
{
RegistryKey localMachine = Registry.LocalMachine;
string productsRoot = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products";
RegistryKey products = localMachine.OpenSubKey(productsRoot);
string[] productFolders = products.GetSubKeyNames();
foreach (string p in productFolders)
{
RegistryKey installProperties = products.OpenSubKey(p + @"\InstallProperties");
if (installProperties != null)
{
string displayName = (string)installProperties.GetValue("DisplayName");
if ((displayName != null) && (displayName.Contains(productDisplayName)))
{
string fileName = "MsiExec.exe";
string arguments = "/x{4F6C6BAE-EDDC-458B-A50F-8902DF730CED}";
ProcessStartInfo psi = new ProcessStartInfo(fileName, arguments)
{
CreateNoWindow = true,
UseShellExecute = false,
RedirectStandardOutput = true
};
Process process = Process.Start(psi);
process.WaitForExit();
return uninstallCommand;
}
}
}
return "";
}
Обновление: после использования установщика WIX MSI
Я создал проект CustomAction в WIX, также создал проект установки с использованием WIX. Пожалуйста, смотрите мой Product.wxs
<InstallExecuteSequence>
<Custom Action='ShowCustomActionCustomAction' After='InstallFinalize'>NOT Installed</Custom>
</InstallExecuteSequence>
У меня есть код для удаления приложения 3 в CustomAction.cs.When я запускаю мой WIX MSI, он устанавливает новое приложение и удаляет первое приложение. Остальные два приложения не удаляются, я заметил, что после успешного удаления первого приложение закрывается и ничего не происходит.
Можете ли вы рассказать мне, как удалить приложение 3 во время установки моего WIX MSI.
Обновление 2:
<Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
<Upgrade Id="89CF8BE7-05EE-4C7E-9EFC-0249DD260EBB">
<UpgradeVersion
Minimum="1.0.0.0" Maximum="99.0.0.0"
Property="PREVIOUSVERSIONSINSTALLED"
IncludeMinimum="yes" IncludeMaximum="no" />
</Upgrade>
<InstallExecuteSequence>
<RemoveExistingProducts Before="InstallFinalize" />
</InstallExecuteSequence>
</Product>
вышеуказанные настройки в product.wxs удаляют предыдущую версию и устанавливают новую. В дополнение к этому мне нужно также удалить еще два приложения зависимостей. Как удалить приложение зависимостей с помощью установщика wix.
Может ли кто-нибудь помочь мне проверить установленное приложение на машине и удалить его перед установкой моего нового wix msi.
Ответы
Ответ 1
В MSI существует мьютекс, который предотвращает одновременную установку/удаление. Все должно происходить в контексте одного установщика. Тем не менее, способ сделать это - написать строки в таблицу Upgrade, чтобы научить FindRelatedProducts и RemoveExistingProducts удалить дополнительные установленные MSI.
Вы не указываете, что используете для создания MSI, поэтому я не могу показать вам, как это сделать.
Вы уже упоминали, что используете VDPROJ. Этот инструмент не поддерживает создание того, что вы пытаетесь сделать. Мое предложение состоит в том, чтобы реорганизовать с помощью Windows Installer XML (WiX) и автора несколько элементов Upgrade для удаления различных продуктов.
Ответ 2
Извините, что у вас плохие новости... но:
при установке/удалении программы с любого современного компьютера на базе Windows - нет возможности запустить более одного экземпляра мастера установки (одним словом: msiExec)
поэтому он отлично работает на других частях вашего проекта, потому что в этих точках не создаются вызовы для msiExec.
и теперь для хороших новостей:
вы можете отправить команду unistall с задержкой или даже лучше - запустите таймер, который запрашивает каждые X секунд, если установка завершена. когда установщик завершит работу, вы сможете сделать команды unistall. что-то вроде этого:
timer = new System.Timers.Timer(2 * 1000) { Enabled = true };
timer.Elapsed += delegate(object sender, System.Timers.ElapsedEventArgs e)
{
}
timer.Start(); // finally, call the timer
Ответ 3
Существует возможность удалить приложение с помощью инструментария управления Windows (WMI).
Используя ManagementObjectSearcher, необходимо удалить приложение и использовать метод ManagementObject Удалить, чтобы удалить приложение.
ManagementObjectSearcher mos = new ManagementObjectSearcher(
"SELECT * FROM Win32_Product WHERE Name = '" + ProgramName + "'");
foreach (ManagementObject mo in mos.Get())
{
try
{
if (mo["Name"].ToString() == ProgramName)
{
object hr = mo.InvokeMethod("Uninstall", null);
return (bool)hr;
}
}
catch (Exception ex)
{
}
}
Подробное объяснение, приведенное в Удаление программ с программным обеспечением (с WMI)