如何在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中的标签。这显示了所有的标准消息,但没有显示我在自定义操作中发送的消息。
知道我做错了什么吗?
主要问题是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...
}
}