如何在Burn托管引导程序应用程序中显示来自WiX自定义操作的信息

本文关键字:WiX 自定义 操作 信息 显示 Burn 应用程序 引导程序 | 更新日期: 2023-09-27 18:28:20

因此,基本上,我试图在自定义操作期间向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中的标签。这显示了所有的标准消息,但没有显示我在自定义操作中发送的消息。

知道我做错了什么吗?

如何在Burn托管引导程序应用程序中显示来自WiX自定义操作的信息

主要问题是Info级别的消息不会传递给ExecuteMsiMessage事件。从我的测试中,我发现Warning是唯一可靠的级别。

我通过在消息中添加一个额外的标志来实现这一点,这样我就可以判断哪些消息是我的,哪些是真正的警告消息(我不想在UI中显示)。然而,为了简单起见,我没有在这里显示:

在自定义操作中:

    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...
        }
    }