Visual Studio安装项目并将应用程序放在启动路径中

时间:2011-11-07 16:28:03

标签: c# setup-project startup registry

我创建了一个在安装开始时执行的函数,用于在SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Run路径中创建注册表项,因此应用程序可以在计算机启动时启动。

此功能适用于XP / 2003计算机,但不适用于Windows 7.安装应用程序在安装过程中会自动提升权限,因为它正在安装Windows服务程序。所以我想知道我又做错了什么?

这是功能:

private void RegisterInStartup(bool isChecked)
{
    try
    {
        string t_registeryPath = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";

        RegistryKey registryKey =
            Registry.LocalMachine.OpenSubKey(t_registeryPath, true);

        if (registryKey == null)
            registryKey = Registry.LocalMachine.CreateSubKey(t_registeryPath);

        if (isChecked)
        {
            string tgt_dir = Context.Parameters["targetPath"];
            if (!Directory.Exists(tgt_dir))
                return;

            string t_exeName = Path.Combine(tgt_dir, "AppTaskbarNotificator.exe");
            if (!File.Exists(t_exeName))
                return;

            registryKey.SetValue("AppTaskbar", t_exeName);
        }
        else
        {
            registryKey.DeleteValue("AppTaskbar");
        }
    }
    catch (Exception)
    {
        return;
    }
}

并将其置于Install函数中,该函数在App的Installer类中被重写。

public override void Install(IDictionary stateSaver)
{
    base.Install(stateSaver);
    System.Diagnostics.Debugger.Break();

    RegisterInStartup(true);
    StartApp();
}

提前致谢。

1 个答案:

答案 0 :(得分:2)

HKEY_LOCAL_MACHINE是每台计算机的位置,因此您的自定义操作需要管理员权限才能在其中写入。您可以通过将其设为deferred with no impersonation来为其提供这些权限。

默认情况下,Visual Studio 2010会使自定义操作延迟而不进行模拟,但旧版本则不会。因此,您可能需要使用Orca编辑MSI以设置适当的标记。

另一种解决方案是在HKEY_CURRENT_USER中编写注册表项。