2014-10-28 67 views
0

因此基本上我試圖在自定義操作期間向刻錄用戶界面顯示自定義消息。 (在從DISM在後臺運行,這種情況下,進度顯示這是我試過的代碼:如何在刻錄託管引導程序應用程序中顯示WiX自定義操作的信息

public static class CAExtensions 
{ 
    public static void SendMessage(this Session session, string message) 
    { 
     var record = new Record(); 
     record.SetString(0, message); 
     session.Message(InstallMessage.Info, record); 
    } 
} 

這在我的自定義操作我這樣做:

session.SendMessage("Message goes here"); 

我訂閱ExecuteMsiMessage事件:

model.BootstrapperApplication.ExecuteMsiMessage += HandleMessage; 

private void HandleMessage(object sender, ExecuteMsiMessageEventArgs e) 
{ 
    Installer.Dispatcher.Invoke((Action) (() => 
    { 
     var rawMessage = string.Empty; 

     var app = model.GetAppData(e.PackageId); 
     if (app != null) 
     { 
      rawMessage = app.Item1.DisplayName + ": "; 
     } 
     rawMessage += e.Message; 

     InstallMessage = rawMessage; 
    })); 
} 

InstallMessage被綁定到用戶界面的標籤。這說明所有標準的消息,但不是那些我在自定義操作發送。

任何想法我做錯了什麼?

回答

2

主要問題是Info級別的消息不會傳遞給ExecuteMsiMessage事件。從我的測試中,我發現Warning是唯一可靠傳遞的水平。

我通過給消息添加一個附加標誌來實現這一點,以便我可以知道哪些消息是我的,哪些是真實的警告消息(我不想在UI中顯示)。不過,我並不表明這裏簡單:

在CustomAction:

public virtual void SendMessage(string message, string[] data) 
    { 
     var fields = new List<object>(data); 

     using (var record = new Record(fields.ToArray()) { FormatString = message }) 
     { 
      _session.Message(InstallMessage.Warning, record); 
     } 
    } 

在引導程序:

private void EventProviderOnExecuteMsiMessage(object sender, ExecuteMsiMessageEventArgs executeMsiMessageEventArgs) 
    { 
     if (executeMsiMessageEventArgs.MessageType == InstallMessage.Warning) 
     {    
       var theActualMessage = executeMsiMessageEventArgs.Data.ToList(); 
       //do something with theActualMessage here... 
     } 

    } 
相關問題