Как удалить 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 в разделе реестра для приложения, которое вы пытаетесь удалить.