以编程方式卸载应用程序

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

我试过下面的VBA,AddIns只包含“XLL Add In”而不是“A COM Add In”。 所以它不起作用。 所以我想写一个exe文件来检测是否安装了A,如果是的话,卸载它。 并在B的安装程序中调用该exe文件。
任何人都知道如何“在C#中卸载程序”? 还是有更好的解决办法? 谢谢一旦我可以检测到A并将其卸载到EXE中,我将能够将它挂在B的安装程序中。安装程序/ Uninstaller类在.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 

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

 msiexec /x YOUR-PRODUCT-CODE 

YOUR-PRODUCT-CODEreplaceYOUR-PRODUCT-CODE安装了AddIn A的MSI软件包中使用的真实产品ID。

你可能想要添加/qn选项来完全禁止它的用户界面。

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

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

你的方法是正确的 – 尤其是你正在创build的exe应该是Setup.exe,它将确保满足前提条件。 即它会卸载A.

如何创buildsetup.exe非常依赖于你必须交付的工具 – 对不起,我可以帮助你,因为我使用的wix3.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);