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

时间:2011-06-01 17:17:41

标签: visual-studio-2010 installer registry setup-project custom-action

过去,我们使用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();
} 

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

我转向MSDN并将我的解决方案更改为Custom Actions Walkthrough之后的模型。我创建了一个类库项目(并删除了我的命令行项目)并添加了一个安装程序类。我们没有在其示例中所示的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);
    }
}

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

任何有关使这个自定义操作正常工作的帮助,或者在安装时运行.reg文件的替代方法都将非常感激。提前谢谢。

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

我在键盘上敲了一下这个问题 - 只有在安装程序类的构造函数中执行自定义安装操作后才能运行它。

我按照我在此处找到的教程:http://msdn.microsoft.com/en-us/library/d9k65z2d(v=VS.100).aspx

答案 2 :(得分:0)

看看这个链接是否有帮助,它帮助了我:

Visual Studio 2008 Installer, Custom Action. Breakpoint not firing

基本上是

之后的代码

base.Install(stateSaver);

没有被执行。所以把base.Install(stateSaver);作为方法的最后一行。

答案 3 :(得分:0)

这看起来似乎很明显,但是它使我陷入了困境,所以不妨发布它。

我只是右键单击安装程序项目,然后单击“安装”和“卸载”。但是,您必须在更改代码后重新构建Installer项目! (可能还有带有安装程序类的项目)