2013-02-19 59 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

相關問題