2014-10-28 65 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... 
     } 

    } 
相关问题