WPF部署项目:在原始安装程序的提交阶段触发另一个msi安装

时间:2009-11-09 21:57:04

标签: wpf deployment windows-installer

我正在使用WPF项目并创建了一个部署项目。我能够让安装程序运行并且运行正常。现在在应用程序的提交阶段,我想触发另一个安装。我尝试创建自定义操作并在customactiondata字段中添加以下命令。

msiexec.exe / i“[SOURCEDIR] \ App.msi”/ qb

当我运行应用程序时,我会看到一个显示MSI选项的帮助窗口。知道没有触发安装程序的原因。

- 巴拉

1 个答案:

答案 0 :(得分:4)

巴拉,

当你说你想在安装后安装App.msi之后,它会让我问你是否控制了这个App.msi,或者你是否正在使用别人的安装程序。我之所以想知道这是因为如果您控制了App.msi,我建议将其更改为合并模块并将此合并模块的输出添加到安装程序项目中。如果您是App.msi的作者,这将是最简单的攻击计划。但是,如果你只是想在你的msi完成后安装其他人的msi,那么你就是在正确的轨道上。基本上你获得MSI选项对话框的原因是因为某些内容格式不正确。我的猜测是你的自定义操作没有正确调用MSIEXEC.EXE,从而导致弹出帮助选项对话框。没有你的源代码,我无法确定具体是什么错误,我只能向你展示一个如何让它工作的例子。我的解决方案如下:

首先,让我们看看解决方案,如果你控制App.msi,并可以将其转换为合并模块。以下是执行此操作的步骤:

  1. 创建合并模块。基本上你只需要把你在MSI中做的东西带到Merge模块,它们与Visual Studio如何向你展示它们的方式基本相同。
  2. 创建您的MSI项目。
  3. 将合并模块的输出添加到MSI中。
  4. 编译并安装MSI。
  5. 现在,对于您无法控制App.msi的情况,您需要执行以下操作:

    1. 创建一个类库项目,根据您的喜好命名。该项目将包含调用外部msi文件的逻辑。
    2. 向此类型为Installer Class的项目添加一个新项目,再次根据您的喜好命名此类。
    3. 删除生成的Class1.vb(.cs)文件,因为它不是必需的。
    4. 创建WPF项目(或添加现有的WPF项目)。
    5. 创建一个安装项目,再次命名您想要的任何内容。
    6. 在类项目中,右键单击安装程序类,然后查看代码。
    7. 为您的类添加代码以进行安装和提交(参见下面的图1):
    8. 在安装程序项目中,添加WPF应用程序的主输出和类库。
    9. 将App.msi文件添加到安装程序项目中。
    10. 打开自定义操作,右键单击自定义操作根节点,然后单击“添加自定义操作...”。
    11. 导航到wpf项目的主要输出,单击“确定”。
    12. 以相同的方式从类库中添加主要输出。
    13. 从安装节点下的类库中选择主输出,并查看其属性。
    14. 在CustomActionData字段下,输入以下内容:
      /OtherMSIPath="[TARGETDIR]\App.msi"
    15. 验证InstallerClass字段是否设置为True。
    16. 构建并安装您的应用程序。
    17. 图1:

       Public Overrides Sub Install(ByVal stateSaver As System.Collections.IDictionary)
        MyBase.Install(stateSaver)
      
        stateSaver.Add("OtherMSIPath", Context.Parameters("OtherMSIPath"))
       End Sub
      
       Public Overrides Sub Commit(ByVal savedState As System.Collections.IDictionary)
        MyBase.Commit(savedState)
        System.Diagnostics.Process.Start("MSIEXEC.EXE", "/i """ & savedState.Item("OtherMSIPath").ToString & """ /qb")
       End Sub
      

      我已将此问题的源代码添加到Google Codehere以供您下载。您可以使用subversion client结帐此示例{{3}}。

      我希望这有帮助,

      谢谢!