如何清理 Windows 安装项目中的 'Run on Startup' 注册表项?

How can I clean up a 'Run on Startup' registry key in a Windows setup project?

我已经编写了一个 WPF 应用程序和一个附带的 Windows 安装项目。该应用程序有一个选项 'Run on startup',此时一个键被添加到 SOFTWARE\Microsoft\Windows\CurrentVersion\Run 注册表。默认情况下,安装项目不会创建此密钥,因为该选项默认处于禁用状态;但是,我想确保如果有人卸载该应用程序,注册表项将被删除。

这可能吗?另外,如果不删除密钥,行为是什么?我假设 Windows 会尝试 运行 应用程序,但什么也不会发生,但我还没有测试这种情况。

编辑 - 根据要求,从代码设置注册表项如下:

using (var key = Registry.CurrentUser.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true))
{
  if (key != null)
  {
    key.SetValue("MyApp", "\"" + System.Reflection.Assembly.GetExecutingAssembly().Location + "\"");
  }
}

这样做是因为默认情况下,我不希望应用程序在启动时 运行;因此,在用户选择使用该设置之前不应创建注册表项。

如果您使用安装自定义操作创建了该关键数据,那么您将需要创建卸载自定义操作以将其删除。严格来说,您还应该包括一个回滚自定义操作以在安装失败并回滚时将其删除。

MSI 文件是系统更改的数据库 - 这就是为什么可以卸载其中的任何内容,但它不会跟踪您对代码所做的更改。

我很想在应用程序配置中的某处设置此选项,而不是安装,因此应用程序可以有一个选项 "start at logon time" 用户可以打开和关闭。目前,任何想要更改该设置的人都必须 fiddle 使用注册表或重新安装该应用程序,具体取决于他们对这些东西的聪明程度。

使用其他安装工具,您有更多选择。例如,Visual Studio 不执行多项功能。使用另一个工具(例如 WiX),您可以创建一个功能,用户检查是否需要启动,并且该功能包含使用 Windows 安装程序注册表项而不是代码创建注册表项的组件。除了没有编码外,条目在卸载时被删除;用户可以随时进入维护模式并卸载(或添加)该功能;安装失败会自动清理。这只是提供功能的一种方式。

Visual Studio 安装程序相对容易使用,因为它们只公开了一组有限的 Windows 安装程序功能,因此您可以得到一些简单性,但如果您想超越这些功能,则需要付费VS 设置提供的。但您也会更深入地参与 Windows 安装程序。