每次我通过快捷方式打开 WPF 应用程序时都会安装它

WPF Application Installs Each Time I Open It via Shortcut

我做了什么:

我创建了一个 Visual Studio 安装项目,它为我的 WPF 应用程序创建了安装程序。此安装程序会创建我用来安装应用程序的 MSI。

我用我的主要项目创建了一个主要输出并为此创建了一个快捷方式。

应用程序安装成功。

问题:

当我单击在桌面上创建的快捷方式时,在应用程序加载和启动之前出现以下屏幕:

Header: [Application Name]
Message: Please wait while Windows configures [Application Name]
Loading Bar Header:
Gathering required information... (Followed by a progress bar and a cancel button)

这会占用不必要的时间。 应用程序在此完成后启动并按预期继续。

如何防止这种情况发生,发生这种情况的原因是什么?

PS:当我从程序文件中的 exe 打开应用程序时,不会发生这种情况。

Visual Studio 安装项目作者公布了快捷方式,这是 MSI 用来确定是否需要修复的机制之一。它检测到需要它并尝试这样做但失败导致无限修复循环。请阅读:

Windows Installer launches unexpectedly, for no obvious reason

这将帮助您确定导致问题的组件。不幸的是,VS 安装项目非常有限,很难解决这个问题。我真的会推荐更好的工具集,例如 WiX、Advanced Installer 或 InstallShield。

这几乎总是会发生,因为人们没有意识到,如果他们安装了一个文件(或注册表项),然后在稍后将其删除,将通过使用广告的快捷方式触发修复。修复还有其他切入点,但捷径是显而易见的。试图阻止修复通常毫无意义,因为还有其他因素可以促使修复已更改的产品。例如升级、补丁和用户右键单击 MSI 进行修复,或从程序和功能中进行修复。

另一个原因是安装程序将项目(例如文件或注册表项)安装到 Everyone 安装中的用户配置文件位置(例如用户数据)。为安装用户安装,但不为其他用户安装,因此修复将安装它。但是,每个新用户只会看到一次。

也有可能导致此问题的 VS 安装项目错误。

防止在安装后修复要删除的文件的记录方法是使文件的组件 ID 为空,VS 安装程序不支持,因此您需要使用 Orca 或 post-构建 MSI 脚本。请在此处查看 ComponentId:

https://msdn.microsoft.com/en-us/library/aa368007(v=vs.85).aspx

请注意,Windows 安装团队建议 MSI 源无论如何都可用,原因有很多,规则 31:

http://blogs.msdn.com/b/windows_installer_team/archive/2006/05/24/605835.aspx