我有一个.NET应用程序,它使用自定义安装程序/卸载程序安装服务。
这已被包装到Windows Installer中,因此在安装时它会注册该服务,当您卸载它时,它会取消注册此服务。但是有些情况下自定义卸载程序可能会失败。 (就我而言,我已经通过调用installutil
手动卸载了该服务。)
现在,当我尝试通过Windows安装程序框架卸载产品时,会出现以下错误:
错误1001.卸载时发生异常。这个例外 将被忽略,卸载将继续。然而 卸载后,可能无法完全卸载应用程序 完成。 - >指定的服务不作为已安装的存在 服务。
这是有道理的。除了那之外,尽管消息说了什么,卸载也会被回滚。 (这个问题也被描述为here)。
我知道如果我手动重新安装服务,卸载可能会有效。
但我想知道是否有某种方法可以强制将其从已安装产品列表中删除。
<小时/> 我目前以编程方式卸载它的方法是调用
::MsiConfigureProduct(productCode.c_str(), INSTALLLEVEL_DEFAULT, INSTALLSTATE_ABSENT);
但这与通过控制面板卸载的效果相同,但失败了。
我还可采取其他方法吗?
答案 0 :(得分:2)
这就是为什么我告诉人们不要使用Visual Studio部署项目,InstallUtil自定义操作,只安装在VM上,而不是安装在自己的盒子上。
所以这就是你需要做的事情:
找到您以前安装的MSI。使用Orca对其进行编辑,然后从InstallExecuteSequence中删除自定义操作(或者在其上放置无操作条件,如GOTOHELL = 666)。
运行命令:
msiexec /i foo.msi REINSTALL=ALL REINSTALLMODE=vomus
这将“重新安排”MSI。现在使用“添加/删除程序”卸载程序。
现在切换到一个更好的工具,实际公开ServiceInstall表。正如您刚刚发现的那样,重新发明轮子永远不会结束。不要让它发生在您的客户身上。
最后,使用SC命令停止和删除孤立服务。