2013-02-19 62 views
2

我写了一个使用WPF管理的wix引导程序。实际的安装步骤需要链接多个msi的/ exe文件和批处理文件。wix bootstrapper

<Chain> 
<MsiPackage SourceFile="xxx"/> 
<ExePackage Id="Test" SourceFile="..\TestBatch.bat" Vital="yes"/> 
<MsiPackage SourceFile="yyy"/> 
</Chain> 

每个包的执行过程中,应显示的消息(优选地从引导程序UI)指示正当前执行MSI/EXE包/批处理文件。 简而言之,引导程序中需要一个ProgressText我该如何做到这一点?

另一个问题:我不希望所有的msi被打包到bootstrapper exe中。这是因为:每次更改msi时,我们只想发布更新/修改的msi,而不是整个引导程序exe。有没有办法做到这一点?

回答

5

两个答案,一个建议:

  1. 到MsiPackages期间得到的消息回正装,处理BootstrapperCore.ExecuteMsiMessage事件。那里的事件将包含一条消息,其中包含您正在查找的数据。

  2. 要配置包的压缩方式,请使用Compress属性。您可以标记整个Bundle/@Compress='no'或标记每个包Compress='no'(或'yes'如果您想要这样做)。

-

建议:一定要DetectCondition添加到ExePackages所以Burn将知道,如果ExePackages已经存在。

+0

谢谢Rob。上述两个建议都很好地满足了我的目的。我想知道是否可以将我的ExecPackage消息传递回引导程序?情况是这样的:我有一些批处理文件需要执行,而我正在使用ExecPackage来完成这个任务。根据批处理中的一些结果,我想显示一条适当的消息给用户,并提供选项以继续/终止/重新启动等。 – microsoftprogrammer 2013-03-07 11:56:14

+0

继续我上面的评论...我想,我可能会将邮件另存为注册表项并在ExecutePackageComplete事件中检索它。有没有其他方法可以做到这一点? – microsoftprogrammer 2013-03-08 07:48:45

+3

您的可执行文件可以实现“嵌入式刻录协议”以发送丰富的进度和错误消息。它根本没有记录,所以你需要通过Burn代码来查看协议,但它在那里,并会准确得到你想要的。 WiX源代码中的“bundlerunner”.csproj可能也有帮助。 – 2013-03-08 08:52:13

0
private void ExecuteMsiMessage(object sender, ExecuteMsiMessageEventArgs e) 
{ 
    lock (this) 
    { 
     switch (e.MessageType) 
     { 
      case InstallMessage.ActionStart: 
      { 
       string[] entireMessage = e.Message.Split(':'); 
       string[] actionMessage = entireMessage[3].Split('.'); 

       if (actionMessage[1].Trim() != "") 
       { 
        PackageMessage = actionMessage[1]; 
       } 
       break; 
      } 
     } 

     e.Result = MainWindowViewModel.Canceled ? Result.Cancel : Result.Ok; 
    } 
} 
+1

欢迎来到stackoverflow。我发现这个答案有两个问题:1)代码格式不正确2)这个答案只是代码。 1.请看这里[如何格式化代码](https://stackoverflow.com/editing-help) 2.虽然这段代码可能回答这个问题,但提供关于为什么和/或这个代码如何回答问题的附加上下文提高了其长期价值。 – 2017-05-02 07:18:29

+0

我已编辑帖子以改善格式。请尽管给你的答案增加一些内容。 – Tom 2017-05-02 07:54:33

相关问题