以编程方式卸载应用程序 - 即使自定义卸载程序失败

时间:2012-09-05 23:49:58

标签: windows-installer

我有一个.NET应用程序,它使用自定义安装程序/卸载程序安装服务。

这已被包装到Windows Installer中,因此在安装时它会注册该服务,当您卸载它时,它会取消注册此服务。但是有些情况下自定义卸载程序可能会失败。 (就我而言,我已经通过调用installutil手动卸载了该服务。)

现在,当我尝试通过Windows安装程序框架卸载产品时,会出现以下错误:

  

错误1001.卸载时发生异常。这个例外   将被忽略,卸载将继续。然而   卸载后,可能无法完全卸载应用程序   完成。 - >指定的服务不作为已安装的存在   服务。

这是有道理的。除了那之外,尽管消息说了什么,卸载也会被回滚。 (这个问题也被描述为here)。

我知道如果我手动重新安装服务,卸载可能会有效。

但我想知道是否有某种方法可以强制将其从已安装产品列表中删除。

<小时/> 我目前以编程方式卸载它的方法是调用

    ::MsiConfigureProduct(productCode.c_str(), INSTALLLEVEL_DEFAULT, INSTALLSTATE_ABSENT);

但这与通过控制面板卸载的效果相同,但失败了。

我还可采取其他方法吗?

1 个答案:

答案 0 :(得分:2)

这就是为什么我告诉人们不要使用Visual Studio部署项目,InstallUtil自定义操作,只安装在VM上,而不是安装在自己的盒子上。

所以这就是你需要做的事情:

找到您以前安装的MSI。使用Orca对其进行编辑,然后从InstallExecuteSequence中删除自定义操作(或者在其上放置无操作条件,如GOTOHELL = 666)。

运行命令:

msiexec /i foo.msi REINSTALL=ALL REINSTALLMODE=vomus

这将“重新安排”MSI。现在使用“添加/删除程序”卸载程序。

现在切换到一个更好的工具,实际公开ServiceInstall表。正如您刚刚发现的那样,重新发明轮子永远不会结束。不要让它发生在您的客户身上。

最后,使用SC命令停止和删除孤立服务。