我正在为WiX / Burn安装程序编写自定义UI。完成后,此安装程序最多可以安装30个不同的应用程序。
我目前能够使用
找出安装程序期望的MSI文件 protected void DetectPackageComplete(object sender, DetectPackageCompleteEventArgs e)
{
Installer.Dispatcher.Invoke((Action)(() => Applications.Add(new Installable
{
Name = e.PackageId,
State = e.State
})));
}
我现在要弄清楚的是如何检测客户端计算机中缺少哪些MSI,以及如何允许用户选择要安装的未安装程序,反之亦然。
有谁知道怎么做/有可能吗?
我正在使用.NET 4.0(要求)和WiX 3.8
答案 0 :(得分:1)
要找出客户端中缺少哪些MSI,您可以解析“BootstrapperApplicationData.xml”文件。此文件包含有关捆绑包的一般信息。它应该位于临时目录中(%temp%{安装程序的guid} \ ba1 \你可以按下win + r并写入%temp%来获取temp文件夹)。它是Burn提取BA dll并运行它的地方,因此您可以在运行时使用Assembly.Location访问它。
在运行时访问它的示例:
string path = this.GetType().Assembly.Location
string manifestNamespace = "http://schemas.microsoft.com/wix/2010/BootstrapperApplicationData";
XElement manifestData = null;
var workingFolder = Path.GetDirectoryName(path);
var bootstrapperDataFilePath = Path.Combine(workingFolder, "BootstrapperApplicationData.xml");
using (var reader = new StreamReader(bootstrapperDataFilePath))
{
var xml = reader.ReadToEnd();
var xDoc = XDocument.Parse(xml);
manifestData = xDoc.Element(ManifestNamespace + "BootstrapperApplicationData");
}
manifestData然后包含您需要的信息。最好的是你在这里插入一个断点并花些时间来实际查看文件的外观;)通过这些信息,你可以找到你缺少的包(未检测到的包)。
之后,您可以为用户提供要选择的软件包(由您决定如何操作),您只需要记住用户想要安装的软件包的packageId。
在调用Engine.Plan(LaunchAction.Install)之后,通过将State属性从event参数设置为Absent或Present,实际告诉Engine应该安装哪些软件包(每个软件包调用一次),请使用PlanPackageBeginEvent。 p>
我建议阅读: https://www.wrightfully.com/part-1-of-writing-your-own-net-based-installer-with-wix-overview
答案 1 :(得分:0)
我写了一系列博客文章,通过这个主题进行讨论,你可以在这里找到:https://www.wrightfully.com/part-1-of-writing-your-own-net-based-installer-with-wix-overview/
具体来说,Handling Current and Future State 上的帖子会逐步检测当前的安装状态并设置未来状态(要采取的操作)。
使用您当前正在使用的DetectPackageComplete
,e.State将为您提供包的当前安装状态,其中包含其中一个(Present
和{{1}是你关心的关键词:
Absent
要设置用户想要执行的操作,您需要为public enum PackageState
{
Unknown,
Obsolete,
Absent,
Cached,
Present,
Superseded,
}
注册一个事件处理程序,您需要设置PlanPackageBegin
属性。例如:
State
详情可在博客文章中找到。