我使用VS2010安装项目构建了一个msi安装程序。
现在项目没有因为自定义操作中的“1001异常:参数machineName的格式无效”(见下文)而卸载。
我没有使用系统控件中的remove或msiexec /uninstall
卸载应用程序。
有没有办法强行卸载?
详细说明:
作为自定义操作的一部分,我注册了一个自定义事件源,我的应用用于事件登录到Windows日志:
public override void Install(IDictionary stateSaver) {
base.Install(stateSaver);
EventLog.CreateEventSource("VeodinRecorder","Application");
}
在“卸载”内部我尝试用
删除此Eventsourceif (!EventLog.SourceExists("VeodinRecorder"))
EventLog.Delete("VeodinRecorder"); `
EventLog.Delete也将machinename作为第二个参数
所以我尝试用msiexec /fv
覆盖用于卸载的msi,并更改了卸载操作:
EventLog.Delete("VeodinRecorder",".");
EventLog.Delete("VeodinRecorder","Application");
我甚至将整个“卸载操作”留空了。
但似乎没有任何效果。
任何提示?
完整日志:
错误1001.错误1001.卸载时发生异常。此异常将被忽略,卸载将继续。但是,卸载完成后可能无法完全卸载应用程序。 - >参数machineName的格式无效。
MSI(s)(60!68)[22:49:00:101]:
调试:错误2769:自定义操作_3C1D0358_8969_4B01_B8FA_B6B43F4E9E4C.uninstall未关闭1个MSIHANDLE。
安装程序在安装此程序包时遇到意外错误。这可能表明此包装存在问题。错误代码是2769.参数是:_3C1D0358_8969_4B01_B8FA_B6B43F4E9E4C.uninstall,1,
CustomAction _3C1D0358_8969_4B01_B8FA_B6B43F4E9E4C.uninstall返回实际的错误代码1603(注意如果翻译发生在沙箱内,这可能不是100%准确)
行动结束时间为22:49:00:InstallExecute。返回值3.
行动结束22:49:00:安装。返回值3。
答案 0 :(得分:5)
使用msiexec /fv
更新安装时似乎未更新CustomAction.dll。
我现在手动将新构建的CustomAction.dll(带有空的卸载覆盖)放入安装文件夹中,并且能够卸载。
更新(对@pcans的信用)使用ORCA编辑当前安装的msi并手动禁用卸载自定义操作。
答案 1 :(得分:0)
仅供参考我想补充一点,您还可以修补已安装的产品并使用次要升级来删除任何错误操作在调用之前卸载序列。这是因为次要升级是重新安装相同的产品,而不是卸载和重新安装新版本(这是一次重大升级)。因此,在错误的运行之前,您可以用正确的序列替换卸载序列。
创建补丁虽然很复杂,即使使用Wise或Installshield等专业工具,但在某些情况下,这是唯一能够正确卸载软件包的解决方法。公司中的“野外”包应该以这种方式修复。
最后,您可以使用Microsoft的 msizap.exe 从Windows Installer数据库中取消注册整个错误的程序包,但这并不好,因为系统的更改根本没有回滚垃圾随处可见。该工具本身有时似乎有点不稳定,有时会产生很难修复的新错误。最好将其用于仅调试。
在这个已经很久的回复中还有一个注意事项:特殊情况是指仅在卸载序列期间运行自定义操作,然后返回错误的返回码 - 有时即使它执行了操作好的。这些操作可以触发非常繁琐的“仅卸载回滚情况”。实际上,当您的卸载到达安装期间从未运行的自定义操作时,它将回滚。这将回滚卸载,因此可以作为安装工作 - 您的产品留在机器上。很奇怪。
底线:跳过卸载期间运行的自定义操作的返回码,使用其他验证机制确保操作成功。