2015-10-13 45 views
0

我已经写了一个WPF应用程序和一个附带的Windows安装项目。该应用程序具有“启动时运行”的选项,此时将一个密钥添加到SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Run注册表中。安装项目默认情况下不会创建该密钥,因为该选项默认为禁用;但是,我想确保是否有人卸载该应用程序的注册表项将被删除。如何在Windows安装项目中清理'启动时运行'注册表项?

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

编辑 - 按照要求,该注册表项从代码设置如下:

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

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

回答

1

如果您使用安装自定义操作创建了该密钥数据,则需要创建一个卸载自定义操作以将其删除。严格地说,如果安装失败并回滚,您还应该包含回滚自定义操作以将其删除。

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

我很想在应用程序配置的某个地方做这个选项,而不是安装,所以应用程序可以有一个选项“登录时开始”,用户可以打开和关闭。目前,任何想要更改该设置的人都必须摆弄注册表或重新安装应用程序,具体取决于他们可能对此有多聪明。

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

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

+0

所以我想答案是,这是不可能在我的情况下,因为你的第三款正是我在我的应用程序中做的。我测试了如果将该选项设置为true,然后卸载并重新启动,会发生什么情况。即使应用程序不再存在,键仍留在注册表中时没有可见的警告/错误;然而,我感到内疚可能会在用户的系统上留下无用的注册表键,他们必须手动清理。 – Paul

相关问题