我使用 Installshield 2011 创建了一个安装程序。我可以用它安装软件,也可以从“程序和功能”界面卸载。
但是如果应用程序已经安装并且我再次单击安装程序,它会显示屏幕说明它将卸载并完成卸载。但卸载实际上并没有发生。
我为“删除”对话框设置了“删除所有”事件,在“删除”表中,我列出了安装模式 2 中列出的所有需要卸载的文件。
不知道问题是什么......特别是因为我可以从“程序和功能”完成后正确卸载。
有什么建议/提示吗?
我使用 Installshield 2011 创建了一个安装程序。我可以用它安装软件,也可以从“程序和功能”界面卸载。
但是如果应用程序已经安装并且我再次单击安装程序,它会显示屏幕说明它将卸载并完成卸载。但卸载实际上并没有发生。
我为“删除”对话框设置了“删除所有”事件,在“删除”表中,我列出了安装模式 2 中列出的所有需要卸载的文件。
不知道问题是什么......特别是因为我可以从“程序和功能”完成后正确卸载。
有什么建议/提示吗?
在试图对此进行过多理论化之前,制作一个适当的、详细的日志文件很有用。替换路径以符合您的要求:
msiexec.exe /x "C:\Test.msi" /L*V! "C:\msilog.log"
命令行参数说明:
/x = run uninstallation sequence /L*V! "C:\Temp\msilog.log"= verbose logging, flush directly to log file without buffer
您实际上是否对该删除对话框进行了任何修改或者它是标准的?为什么要将文件添加到 RemoveFile 表中?还是那是自动发生的?通常不需要将文件添加到 RemoveFile 表,除非它们是由您的应用程序生成的并且您希望它们在卸载时删除(通常在用户配置文件中)。
话虽如此,几天前我刚刚回答了一个关于在静默模式和交互模式下运行卸载的区别的问题。请阅读以下答案(及其相关问题):Uninstall from Control Panel is different from Remove from .msi
更新:
可以卸载MSI 文件的不同方式的卸载参考:Uninstalling an MSI file from the command line without using msiexec
如果您正在处理Installscript MSI文件,请尝试阅读其setup.exe 参数的此参考:
我想到了一些调试建议:
尝试创建一个新的 Basic MSI 项目并在 Installshield 中手动比较对话框中的详细信息。为您的新项目添加一些测试文件,并确保它以所有方式卸载(尤其是不适用于您的主要设置的方式)。
如果没有看到任何明显的内容,或者您想要更有效的比较,请使用 Wix 的dark.exe文件将您编译的 MSI 反编译为您的原始项目和新项目的 Wix XML 格式。然后找到对话框的 Wix XML 并检查设置。
版本控制您的安装源!当像这样的问题浮出水面时,您有更好的调试机会 - 包括将整个设置恢复几个修订版并重新执行旧源中缺少的内容。
如果您可以使新设置正常工作而旧设置不配合,那么将所有组件从旧设置迁移到新设置并不是那么复杂。我这样做是为了使用“导出到项目”选项从 Installscript MSI 迁移到基本 MSI,方法是右键单击每个组件(我相信这就是选项所在的位置)。我只花了几个小时就完成了一个大型设置。然后它会再花几个小时来正确验证所有自定义操作。
作为记录:将Wix与基于文本的源文件一起使用会使调试变得更加容易,强烈推荐:Windows Installer 和 WiX 的创建。一旦习惯了它,您就可以将创建安装程序的速度与商业工具相匹配。
关于 Wix 的详细信息,包括快速入门建议: MSI 与 nuget 包:哪个更适合持续交付?
有关安装程序的更多帮助,请查看: http: //www.installsite.org/