Wix:注册然后启动Windows服务

时间:2011-12-09 09:04:35

标签: wix

我遇到过一种情况,我被要求在Wix中重新实现和安装InstallShield安装程序。我在互联网上试图实现确切行为的例子有困难。我需要做的是:

当用户点击VerifyReadyDlg上的Install按钮(我正在使用Mondo)并且ProgressDlg出现时:

  • 在安装位置调用.exe(如果存在以前的安装位置)
  • 在安装位置停止服务(如果以前的安装中存在)
  • 取消注册所述服务(如果存在以前的安装)
  • 从MSI复制文件,包括服务.exe的副本以安装位置
  • 从上一个对话框中的某些“编辑”控件读取数据,并将数据写入现在位于安装位置的某些复制的.xml配置文件
  • 再次注册服务

单击最后一个对话框(ExitDlg)上的“完成”按钮,我需要:

  • 再次启动服务
  • 在安装位置
  • 中调用.exe(与第一个不同)

我可以复制文件并在复制之后将数据写入一些文件......虽然Wix只是这样做...我不告诉它什么时候去做。问题是我需要在复制操作开始之前安排第一个.exe调用,服务停止和取消注册,并且我只能在.xml配置文件更新后再次注册。

我一直在尝试使用InstallExecuteSequence和ServiceInstall元素并将它们与CustomActions捆绑在一起,但它并没有聚集在一起,我认为我完全接近这个错误的方式......我不能发布我所做的事情。

我应该怎么做?这是我在InstallSheild脚本中看到的常见模式,但我找不到执行此序列的任何Wix示例。

感谢一大群人对此有所帮助。 迈克尔。

2 个答案:

答案 0 :(得分:0)

您可以使用Custom elementBeforeAfter属性或标准操作的元素来控制何时安排您的操作。

当前安装是否使用MSI进行?如果是,您可能希望在复制现有配置之后但在执行其他安装操作之前执行升级安装并安排RemoveExistingProducts。这样,以前的软件包将使用自己的卸载逻辑删除,然后您可以安装更新的软件包。

要保存先前版本的配置,您必须在执行RemoveExistingProducts之前运行操作。

答案 1 :(得分:0)

您可能希望使用您在C#中从您创建的输出到DLL文件的项目中定义的自定义操作:

public static class CustomActions
{
    [CustomAction]
    public static ActionResult DoSomething(Session session) {
       // Put C# code here that does what you describe, such as run an exe 
       // from the command prompt.
       return ActionResult.Success;
    }
}

将此DLL导入Wix安装程序:

<!-- The custom action DLL itself.-->
<Binary Id="WebAppCA" SourceFile="$(var.SolutionDir)..\WebAppInstallCustomActions\bin\Debug\WebAppInstallCustomActions.CA.dll" />

<!-- The custom action that does something that you can use. -->
<CustomAction Id="DoSomething"
                  BinaryKey="WebAppCA"
                  DllEntry="DoSomething"
                  Execute="immediate"
                  Return="check" />

如果您想查看完整的解决方案,请参阅John Robbins的博客(link)上的此主题...他有一个安装IIS站点的Wix安装程序但是当您启动它时,它使用自定义在C#中定义的动作,用于枚举网站列表。