安装和部署项目创建额外的 Add/Remove 程序图标

Setup & Deployment Project creates extra Add/Remove Programs Icons

我有一个奇怪的问题...

我使用 Visual Studio 2013 在 C# 中创建了一个基本的 WinForms 应用程序,并且我向解决方案添加了一个设置和部署项目以构建我的 .msi 安装程序。对于设置和部署项目的属性,我将 DetectNewerInstalledVersion 设置为 true,并将 RemovePreviousVersions 设置为 true。然后,在每次构建时,我都会增加版本号并让 Visual Studio 更改 ProductCode。最后,我会确保 UpgradeCode 保持不变。

在此配置中,如果用户 运行 安装了先前版本的 .msi,则它会执行升级。一切正常(因为所有文件都更新到新版本等)。但是,当他们打开 Add/Remove 个程序时,旧版本的图标仍然存在,还有新版本的图标。

例如,如果他们使用 .msi 安装 MyApp 版本 1.1,然后使用 .msi 升级到 1.2,然后再次升级到 1.3,那么 MyApp 将正确更新到版本 1.3,但用户去卸载在Control Panel->Programs and Features->Uninstall a program,会出现三个MyApp图标(每个版本一个)。要正确卸载 MyApp,他们必须 right-click/uninstall 所有三个。如果我从注册表中删除旧版本(对陈旧图标的通常修复),则 MyApp 将无法正确卸载。卸载将顺利进行,但程序文件和图标将保留,应用程序仍将正常运行。为了排除故障,我制作了一系列具有连续版本号的构建,然后在文本编辑器中打开每个构建的 .vdproj 文件以确保 ProductCode 和 PackageCode 已更新,但 UpgradeCode 保持不变。他们这样做,所以这不是 UpgradeCode 更改的问题。我也试过删除旧图标的注册表项。这会将它们从“程序和功能”卸载列表中移除,但会阻止以这种方式正确卸载程序,因此这不是一个选项。

有人有什么想法吗?

当第一次安装(比如)每个人并且升级安装只有我(或反之亦然)时,就会发生这种情况。一种类型不会升级另一种类型,因此如果安装到同一位置,文件将被替换,但程序和功能中的每个文件都会有一个条目。他们都必须是 Everyone 或 Just me 才能替换以前的产品。

您可以使用 msiexec /I [msi 文件路径] /l*v [日志文件路径] 安装升级以查看发生了什么。如果您搜索 FindRelatedProducts 的出现,您应该看到它找到的内容以及它是否是正确的上下文。

请注意,如果您没有管理员权限,Visual Studio 设置可以更改上下文。您可以指定 Everyone 安装,但如果您没有权限,Visual Studio 会将其更改为 Just me。

好的。奇怪...

问题出在 运行 的方式上。安装后,该程序会检查网络共享是否有更新的 .msi,如果检测到一个,就会下载它,然后使用 Process.Start 和命令行参数启动它。 StartInfo.Arguments 字符串看起来像:

startInfo.Arguments = "/i \"[MSIPATH]\" /log \"[LOGPATH]\"  TARGETDIR=\"[APPPATH]\" /qr+";

我猜有人在最后用粗手指操作了 UI 模式开关。 “/qr+”开关应该是“/qb!-”。当我更改它时,问题停止了。我认为“/qr+”甚至不是一个有效的开关,所以我不确定为什么安装没有直接失败???无论如何,如果有人看到类似的东西,那就是问题所在。

特别感谢 PhilDW 指点我查看日志。 :-)