English 中文(简体)
自定义操作不起作用-Visual Studio安装程序项目
原标题:Custom Action not working - Visual Studio Setup Project

过去,我们曾使用Advanced Installer为特定项目构建.msi安装程序。我们的高级安装程序年度许可证已过期,因此为了避免续订成本,并且我认为Visual Studio也可以实现这一点,我正尝试使用Visual Studio 2010安装项目来构建我的.msi

在大多数情况下,我使用Visual Studio构建的安装程序运行良好。然而,我们需要安装程序做的一件事是运行几个.reg文件,将大量设置添加到注册表中(值得注意的是,这是一个旧软件,只有在不久的将来被完全替换之前才会进行维护和更新。更改存储设置的方法是不现实的)。使用Advanced Installer,我们能够将.cmd文件作为“安装”自定义操作执行,该操作将运行安装中包含的这些.reg.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,并将我的解决方案更改为以他们的自定义操作演练。我创建了一个类库项目(并删除了我的命令行项目),并添加了一个安装程序类。我没有像他们的示例中那样在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文件在安装时运行的替代方法,我们都将不胜感激。提前谢谢。

问题回答

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

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

在这个问题上,我的头在键盘上敲了一下——只有在把我的自定义安装操作放在安装程序类的构造函数中之后,它才运行起来。

我遵循了我在这里找到的教程:http://msdn.microsoft.com/en-us/library/d9k65z2d(v=VS.100).aspx

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

Visual Studio 2008安装程序,自定义操作。断点未启动

基本上

base.Install(stateSaver);

is not getting executed. So put the base.Install(stateSaver); as the last line in the method.

这可能看起来很明显,但它让我有一段时间陷入困境,所以不妨把它发布出来。

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





相关问题
Correct place to install demostration projects?

With the new Windows 7 restrictions (well, new to Windows Vista anyways), we can no longer install demo projects to %ProgramFilesFolder%OurApplicationdemo since restricted users will not be able to ...

.deb package conffiles problem

I am distributing one of my applications using a .deb package, but have a problem relating to one of the files. The distribution includes a database file which is constantly updated by the app, on a ...

Closing an application using WiX

In creating my WiX installer I have run into an issue when trying to close an application before installing the upgrade. Below is an example of how I am attempting to do this. <util:...

VS 2005 Setup - HKCU

I am trying to fix an existing application that uses a Visual Studio 2005 setup project. We are requiring it to work on limited user accounts for XP, our app is written in C# for .Net 2.0. It writes ...

Do I want Publish or Release Build in VB.net?

I wrote a little (like 40 lines little) Winforms application with VB.net in Visual Studio 2010. Now I ve released the code as a Google Code project. It s easy for a developer to get the source but I d ...

configsource and installer

I have an project csproj, with app.config file, and logging Ent.Library section using configsource attribute. The logging section is in ahother file Configloggingconfiguration.config. I have a ...

热门标签