以编程方式卸载应用程序

时间:2012-02-27 21:02:32

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

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

我尝试过如下的VBA,AddIns只包含“A XLL Add In”但不包含“A COM Add In”。所以它不起作用。所以我想编写一个exe来检测是否安装了A,如果是,请将其卸载。 并在B的安装人员中调用exe 任何人都知道如何“在C#中卸载程序”?还是有更好的解决方案?谢谢 一旦我可以检测到A并在exe中卸载它,我就可以将其挂钩到B的安装程序中。 .NET中的Installer / Uninstaller类不是一个选项,因为我没有在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

4 个答案:

答案 0 :(得分:2)

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

msiexec /x YOUR-PRODUCT-CODE

YOUR-PRODUCT-CODE替换为安装了AddIn A的MSI包中使用的实际产品ID。

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

MSI还提供了可用于查明产品是否已安装并可将其卸载的API。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

你如何创建setup.exe非常依赖于你必须使用的工具 - 抱歉,我可以帮助你,因为我使用wix3.0,这在这方面非常有限。

答案 3 :(得分:0)

您可以使用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);