Как удалить MSI, используя его код продукта в C#

Я знаю, что мы можем удалить приложение Windows, используя его MSI, передавая аргументы команды следующим образом:

Process p = new Process(); 
p.StartInfo.FileName = "msiexec.exe"; 
p.StartInfo.Arguments = "/x \"C:\\MyApplication.msi\"/qn"; 
p.Start(); 

Но я хочу знать, как мы можем удалить приложение, не используя MSI? В приведенном выше сценарии у меня должен быть MSI в определенном месте, чтобы удалить это приложение. Если я могу выполнить нестандартный код продукта, тогда мне не нужно иметь MSI на целевой машине.

4 ответа

Решение

Согласно MSDN, вы можете удалить его, используя код продукта:

msiexec.exe /x {your-product-code-guid}

Когда вы используете код продукта, он использует кэшированный MSI из C:\WINDOWS\Installer,

В дополнение к ответу PhilmE, Windows Installer XML (WiX) поставляет библиотеку взаимодействия Microsoft.Deployment.WindowsInstaller как часть Deployment Tools Foundation (DTF). Это пропускает взаимодействие COM и инкапсулирует Win32 API.

using Microsoft.Deployment.WindowsInstaller;

public static void Uninstall( string productCode)
{
    Installer.ConfigureProduct(productCode, 0, InstallState.Absent, "REBOOT=\"R\" /l*v uninstall.log");
}

Вероятно, для вашего случая достаточно знать параметр "/x". Два замечания по этому поводу: более безопасным является добавление части "REBOOT=R" в вашу командную строку. И вы можете добавить путь к лог-файлу:

msiexec /x "..." /qn REBOOT=R /L*v "c:\mylogdir\mymsi.log"

Во-вторых, не пытайтесь изменить что-либо на "кеширование". Вам даже не нужно это понимать. Если кэшированный пакет будет поврежден, регулярная деинсталляция больше невозможна, что может привести компьютер в состояние "необходима поддержка".

Потому что ваш вопрос изначально говорил о C# .. Вам не нужно использовать msiexec для этого:

а) Используйте исходный API C/C++ с функцией MsiInstallProduct() или MsiConfigureProduct(). Ссылка MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/aa370315%28v=vs.85%29.aspx

Вы должны использовать взаимодействие, чтобы использовать это в C#.

или б) Использовать объект установщика Windows. Например, на этот связанный случай уже был дан ответ здесь в stackru: программная установка пакетов MSI Но для использования этой функции необходим физический пакет, также для удаления. С небольшой косвенностью, вот лучший код для удаления:

Сначала добавьте ссылку на COM-объект "Библиотека объектов установщика Microsoft Windows" в ваш проект.

using WindowsInstaller;


public static class MyMsiLib
{
    public static void Uninstall(string productCode)
    {

         Type type = Type.GetTypeFromProgID("WindowsInstaller.Installer");
         Installer installer = (Installer)Activator.CreateInstance(type);
         installer.UILevel=msiUILevelNone;
         installer.ConfigureProduct(productCode, 0, msiInstallStateAbsent);
    }
}

Свойство UILevel before устанавливается здесь жестко, чтобы определять уровень пользовательского интерфейса без звука, как вам кажется. То же самое для других свойств. См. Документацию MSDN, например, указанную в ссылке выше.

Конечно, "настоящие программисты" работают с оригинальным API вместо "объекта-установщика":-) Но для небольших целей этого достаточно. И проще.

Эта команда работает в командной строке:

msiexec /x {3A40307D-6DF2-4412-842F-B1D848043367} /quiet

Я не пробовал это в C#, но замена ваших аргументов ключом, показанным выше, должен работать. Вы можете найти GUID в разделе реестра для приложения, которое вы пытаетесь удалить.

Другие вопросы по тегам