Ответ 1
В соответствии с MSDN, вы можете удалить его с помощью кода продукта:
msiexec.exe /x {your-product-code-guid}
Когда вы используете код продукта, он использует кешированный MSI от C:\WINDOWS\Installer
.
Я знаю. Мы можем удалить приложение Windows, используя его MSI, передав аргументы команды следующим образом:
Process p = new Process();
p.StartInfo.FileName = "msiexec.exe";
p.StartInfo.Arguments = "/x \"C:\\MyApplication.msi\"/qn";
p.Start();
Но я хочу знать, как мы можем удалить приложение без использования MSI? В приведенном выше сценарии мне нужно, чтобы MSI в определенном месте удалила это приложение, если я могу не использовать код продукта, тогда мне не нужно иметь MSI на целевой машине.
В соответствии с 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"
Во-вторых, не пытайтесь изменить что-либо на "кеширование". Вам не нужно даже понимать это. Если кешированный пакет будет разбит, обычная деинсталляция больше невозможна, что может привести к тому, что компьютер будет находиться в состоянии "необходимо поддерживать".
Потому что ваш вопрос изначально говорил о С#.. Вам не нужно использовать msiexec для него:
a) Используйте исходный C/С++ API с функцией MsiInstallProduct() или MsiConfigureProduct(). MSDN ref: http://msdn.microsoft.com/en-us/library/windows/desktop/aa370315 (v = vs .85).aspx
Вы должны использовать interop для использования в С#.
или b) Используйте объект установщика Windows. Например, этот связанный случай уже был указан здесь в stackoverflow: Программная установка пакетов 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 установлено жестко запрограммированным, чтобы определить уровень пользовательского интерфейса беззвучно, как вам кажется. То же самое для других свойств. См. Документацию MSDN, например. упомянутый в ссылке выше.
Конечно, "настоящие программисты" работают с оригинальным API, а не с "Installer Object":-) Но для небольших целей этого достаточно. И проще.
Эта команда работает в командной строке:
msiexec /x {3A40307D-6DF2-4412-842F-B1D848043367} /quiet
Я не пробовал это на С#, но замена ваших аргументов с помощью приведенного выше ключа должна работать. Вы можете найти GUID в разделе реестра для приложения, которое вы пытаетесь удалить.