【问题标题】:Uninstall an application programmatically以编程方式卸载应用程序
【发布时间】:2012-03-17 08:26:00
【问题描述】:

我们有一个 Excel 插件,比如用 C# 编写的 A,Add-In Express。安装程序是从 VS 中的安装项目构建的。 现在我们想将它集成到另一个更大的插件应用程序中,比如 B。 我们希望能够在安装 B 的过程中卸载 A。 B 也是用 C# 编写的,但它的安装程序是从 Advanced Installer 构建的。

我尝试了如下所示的 VBA,加载项仅包含“A XLL 加载项”但不包含“A COM 加载项”。所以它不起作用。所以我想写一个exe来检测是否安装了A,如果是,卸载它。 并在 B 的安装程序中调用 exe。
任何人都知道如何“卸载 C# 中的程序”?还是有更好的解决方案?谢谢 一旦我可以检测到 A 并在 exe 中卸载它,我就可以将它挂接到 B 的安装程序中。 .NET 中的安装程序/卸载程序类不是一个选项,因为我没有在 B 的安装程序中使用它们。

Dim item As AddIn
Set item = Application.AddIns("A COM Add In")

If Not item Is Nothing Then
    item.Installed = False
    'item = Nothing 'Not sure if this does anything
End If

    Dim item As AddIn
Set item = Application.AddIns("A XLL Add In")

If Not item Is Nothing Then
    item.Installed = False
    'item = Nothing 'Not sure if this does anything
End If

【问题讨论】:

    标签: c# excel windows-installer add-in uninstallation


    【解决方案1】:

    您可以通过直接调用 MSI 来卸载之前的版本:

    msiexec /x YOUR-PRODUCT-CODE
    

    将YOUR-PRODUCT-CODE 替换为安装了插件 A 的 MSI 包中使用的真实产品 ID。

    您可能需要添加 /qn 选项以完全抑制其 UI。

    MSI 还提供 API,您可以使用它来确定产品是否已安装和卸载。

    【讨论】:

      【解决方案2】:

      您可以对两个安装程序使用相同的升级代码。如果升级代码相同且安装程序 B 的版本高于 A,则在安装 B 的过程中,MSI 将卸载 A 包。

      【讨论】:

        【解决方案3】:

        您的方法是正确的 - 特别是您正在创建的 exe 应该是 Setup.exe,这将确保满足先决条件。即它会卸载A。

        您如何创建 setup.exe 很大程度上取决于您必须使用哪些工具 - 抱歉,我可以帮助您很多,因为我使用的是在这方面非常有限的 wix3.0。

        【讨论】:

        • 谢谢,抱歉没有说清楚。我已经创建了安装程序 B,它工作正常。我的问题是如何从 C# 卸载程序?一旦解决了,我就可以在B的安装程序中挂接exe了。
        • 好的 - 只要你不尝试在另一个 msi 已经在执行时运行它,我认为你最好的选择是 Process.Start() 调用 msiexec.exe
        • 感谢@dice。是的,我找到了使用 msiexec.exe @social.msdn.microsoft.com/forums/en-us/netfxbcl/thread/… 卸载的示例代码。有用。谢谢!
        【解决方案4】:

        您可以使用 WMI - ManagementObject 来完成此操作。

         ManagementObjectSearcher search = new ManagementObjectSearcher("SELECT * FROM    Win32_Product"); 
        
         ManagementObject product = search.Get().Cast<ManagementObject>().ToList().Where(obj
        => obj["Name"].ToString().StartsWith([Name of product to Uninstall])).FirstOrDefault();
        
         if (uninstallObject != null)
            object result = product.InvokeMethod("Uninstall", null);
        

        【讨论】:

        • Win32_Product 非常缓慢且有问题。我建议使用 WiX 的 DTF 库中的 Microsoft.Deployment.WindowsInstaller 互操作。它具有直接封装底层 MSI Win32 API 调用的托管类,而 Win32_Product 在实现方面做得很差。
        • @ChristopherPainter 关于在哪里寻找使用 Microsoft.Deployment.WindowsInstaller 互操作的示例的任何建议?
        • 我的博客有很多例子。该库附带一个非常详尽的 SDK 帮助文件,其中包含示例。
        猜你喜欢
        • 2011-10-12
        • 1970-01-01
        • 2019-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-20
        • 2011-04-24
        相关资源
        最近更新 更多