【问题标题】:how to replace the uninstallation part of an MSI如何替换 MSI 的卸载部分
【发布时间】:2011-06-01 06:57:27
【问题描述】:

我已经使用 VS2010 安装项目构建了一个 msi 安装程序。

现在项目不会卸载,因为自定义操作中出现“1001 异常:参数 machineName 的格式无效”(见下文)。

我在使用从系统控件中删除或msiexec /uninstall 卸载应用程序时失败。

有没有办法强制卸载?

详情:

作为自定义操作的一部分,我注册了一个自定义事件源,我的应用程序使用该事件源将事件记录到 Windows 日志中:

public override void Install(IDictionary stateSaver) {  
        base.Install(stateSaver);  
        EventLog.CreateEventSource("VeodinRecorder","Application");  
}  

在“卸载”中,我尝试使用删除此事件源

if (!EventLog.SourceExists("VeodinRecorder"))  
   EventLog.Delete("VeodinRecorder"); `

EventLog.Delete 也将机器名作为第二个参数 所以我尝试用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。

【问题讨论】:

    标签: uninstallation windows-installer


    【解决方案1】:

    当我用msiexec /fv更新安装时,似乎CustomAction.dll没有更新。

    我现在手动将新构建的 CustomAction.dll(带有空的卸载覆盖)放入安装文件夹并能够卸载。

    更新:(感谢@pcans)使用 ORCA 编辑当前安装的 msi 并手动禁用卸载自定义操作。

    【讨论】:

    • 我希望我能给你更多的投票。这个问题整天困扰着我,用空的卸载覆盖手动替换 dll 修复它就像一个魅力。
    • 这里确实有用的答案。但我改为使用 ORCA 编辑当前安装的 msi 并手动禁用卸载自定义操作。
    【解决方案2】:

    仅供参考我想补充一点,您还可以通过次要升级修补已安装的产品,以消除任何错误操作在它被调用之前卸载序列。这是有效的,因为次要升级是重新安装同一产品,而不是卸载和重新安装新版本(这是主要升级)。因此,在运行错误的顺序之前,您需要用正确的顺序替换卸载顺序。

    尽管创建补丁程序相当复杂,即使使用 Wise 或 Installshield 等专业工具也是如此,但在某些情况下,这是唯一可以正确卸载软件包的修复程序。公司中“在野外”的包裹应该以这种方式修复。

    最后,您可以使用 Microsoft 的 msizap.exe 从 Windows Installer 数据库中取消注册整个错误包,但这并不好,因为对系统的更改根本不会回滚,而且很多垃圾到处都是。该工具本身有时也似乎有点不稳定,有时会产生很难修复的新错误。最好将它用于仅用于调试

    在这个已经很长的回复中进一步说明:特殊情况是当您仅在卸载序列期间运行自定义操作,然后它返回错误的返回代码 - 有时即使它执行了它操作正常。这些操作可能会触发非常烦人的“仅卸载回滚情况”。实际上,当您遇到安装期间从未运行过的自定义操作时,您的卸载会被回滚。这将回滚卸载并因此作为安装工作 - 您的产品留在机器上。很奇怪。

    底线:跳过在卸载期间运行的自定义操作的返回码,使用其他验证机制来确保操作成功。

    【讨论】:

      猜你喜欢
      • 2021-09-23
      • 1970-01-01
      • 2014-02-20
      • 2012-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多