如何在Burn Managed Bootstrapper应用程序中显示来自WiX自定义操作的信息

时间:2014-10-28 17:46:52

标签: c# wix windows-installer burn

所以基本上我试图在自定义操作期间向Burn UI显示自定义消息。 (在这种情况下显示DISM在后台运行的进度。这是我尝试过的代码:

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绑定到UI中的Label。这显示了所有标准消息,但不显示我在自定义操作中发送的消息。

知道我做错了吗?

1 个答案:

答案 0 :(得分: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);
        }
    }

在Bootstrapper中:

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

    }