Удаление приложения во время установки не работает

Я разрабатываю приложение 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)