所以基本上我试图在自定义操作期间向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。这显示了所有标准消息,但不显示我在自定义操作中发送的消息。
知道我做错了吗?
答案 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...
}
}