过去,我们曾使用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文件在安装时运行的替代方法,我们都将不胜感激。提前谢谢。