7

我知道我们可以通过传递命令参数来使用它的 MSI 卸载 Windows 应用程序,如下所示,

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

但我想知道的是我们如何在不使用 MSI 的情况下卸载应用程序?在上述情况下,我应该在特定位置安装 MSI 来卸载此应用程序,如果我可以使用产品代码卸载,那么我不需要在目标机器中安装 MSI。

4

4 回答 4

7

根据MSDN,您可以使用产品代码将其卸载:

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

当您使用产品代码时,它使用来自C:\WINDOWS\Installer.

于 2013-07-08T10:15:35.617 回答
6

按照 PhilmE 的回答,Windows Installer XML (WiX) 将 Microsoft.Deployment.WindowsInstaller 互操作库作为部署工具基础 (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");
}
于 2013-07-08T20:37:08.183 回答
4

可能对于您的情况,知道“/x”参数就足够了。对此有两点评论:更安全的是在命令行中添加“REBOOT=R”部分。您可以添加日志文件路径:

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

其次,不要尝试将任何内容更改为“缓存”。你甚至不需要理解它。如果缓存的软件包被破坏,则无法再进行常规卸载,这可能会使计算机处于“需要支持”状态。

因为您的问题最初是在谈论 C# .. 您不必为此使用 msiexec :

a) 使用带有函数 MsiInstallProduct() 或 MsiConfigureProduct() 的原始 C/C++ API。MSDN 参考: http: //msdn.microsoft.com/en-us/library/windows/desktop/aa370315 (v=vs.85).aspx

您必须使用互操作才能在 C# 中使用它。

或 b) 使用 Windows 安装程序对象。例如,这个相关案例已经在 stackoverflow 中得到解答: Programmatically installed MSI packages 但使用此功能需要物理包,也用于卸载。稍微间接一点,这里是更好的卸载代码:

首先,在您的项目中添加对 COM 对象“Microsoft Windows Installer Object Library”的引用。

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 属性在此处设置为硬编码,以确定您似乎想要的 UI 级别静默。其他属性也一样。请参阅上面链接中提到的 MSDN 文档。

当然,“真正的程序员”使用原始 API 而不是“安装程序对象”:-) 但对于小目的来说,这就足够了。而且更容易。

于 2013-07-08T19:51:30.967 回答
2

此命令适用于命令行:

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

我没有在 C# 中尝试过,但是用上面显示的键替换你的参数应该可以。您可以在您尝试卸载的应用程序的注册表项中找到 GUID。

于 2013-07-08T10:16:56.760 回答