自定义操作不起作用 - Visual Studio安装项目

Tim*_*man 7 registry installer custom-action setup-project visual-studio-2010

过去,我们使用Advanced Installer为特定项目构建我们的.msi安装程序.我们的高级安装程序的年度许可证已过期,因此为了避免续订成本,并且因为我认为可以使用Visual Studio完成相同的操作,所以我尝试使用Visual Studio 2010安装项目来构建我的.msi.

在大多数情况下,我使用Visual Studio构建的安装程序工作正常.但是,我们需要安装程序执行的一件事是运行几个.reg文件以向注册表添加大量设置(可能值得注意的是,这是旧软件,只有在更换后才会进行维护和更新完全在不久的将来.改变我们存储设置的方法是不切实际的).使用Advanced Installer,我们能够执行.cmd文件作为"安装"自定义操作,该操作将运行安装中也包含的这些.reg文件.VS安装项目具有自定义操作,但似乎在这里它们必须是.dll.exe文件,因此我必须找到使用.bat.cmd文件的替代方法.

首先,我尝试将一个命令行项目添加到我的解决方案中,该解决方案仅包含main()方法中的以下行:

using (Process registryInput = Process.Start("regedit.exe", "/s Settings1.reg"))
{
    registryInput.WaitForExit();
}

using (Process registryInput= Process.Start("regedit.exe", "/s Settings2.reg"))
{
    registryInput.WaitForExit();
} 
Run Code Online (Sandbox Code Playgroud)

我将此项目的主要输出添加到"自定义操作"编辑器的"安装"文件夹中.试图运行安装程序,但命令行进程似乎从未运行过,也没有安装任何注册表设置.如果我从安装它的应用程序目录手动运行命令行可执行文件,它会按预期添加注册表项 - 所以问题不在于我用来调用.reg文件的代码.

我转向MSDN并更改了我的解决方案,以便在他们的自定义操作演练之后进行建模.我创建了一个类库项目(并删除了我的命令行项目)并添加了一个安装程序类.我们没有在其示例中所示的Commit()方法中使用Microsoft的网站URL启动浏览器,而是将上面的代码添加到Install()方法中.这是我最终得到的:

[RunInstaller(true)]
public partial class Installer1 : System.Configuration.Install.Installer
{
    public Installer1()
    {
        InitializeComponent();
    }

    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
    public override void Install(IDictionary stateSaver)
    {
        base.Install(stateSaver);

        using (Process registryInput = Process.Start("regedit.exe", "/s Settings1.reg"))
        {
            registryInput.WaitForExit();
        }

        using (Process registryInput = Process.Start("regedit.exe", "/s Settings2.reg"))
        {
            registryInput.WaitForExit();
        } 
    }

    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
    public override void Commit(IDictionary savedState)
    {
        base.Commit(savedState);
    }

    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
    public override void Rollback(IDictionary savedState)
    {
        base.Rollback(savedState);
    }

    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
    public override void Uninstall(IDictionary savedState)
    {
        base.Uninstall(savedState);
    }
}
Run Code Online (Sandbox Code Playgroud)

我将此新类库项目的主要输出添加到"自定义操作"编辑器的"安装"文件夹中.但是,当我运行安装程序时,代码似乎没有执行,我的注册表设置也没有添加.我已尝试将此安装程序设置为"为所有用户安装"和"仅限此用户".

任何有助于使这个自定义操作工作的帮助或一个替代方法来获得一个.reg文件在安装时运行将不胜感激.先感谢您.

Met*_*urf 5

我刚遇到同样的问题,重新:安装程序没有选择自定义操作.解决方案是以管理员身份运行Visual Studio.

即使我在我的机器上没有任何限制(AFAIK)的完全管理员,安装程序也永远不会接受自定义操作.只要我关闭Visual Studio然后以管理员身份重新启动(右键单击>以管理员身份运行),安装程序就会立即选择自定义操作.

  • 谢谢.你刚给我省了一台新显示器的费用.我距离冲了大约两秒钟. (5认同)