我们有一个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
答案 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);