Как удалить MSI с помощью кода продукта в С#

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

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

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

Ответ 1

В соответствии с MSDN, вы можете удалить его с помощью кода продукта:

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

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

Ответ 2

В соответствии с ответами 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");
}

Ответ 3

Вероятно, для вашего случая, зная параметр "/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":-) Но для небольших целей этого достаточно. И проще.

Ответ 4

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

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

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