如何在WiX / Burn中安装特定的MSI

时间:2014-09-15 19:00:05

标签: .net wpf wix windows-installer burn

我正在为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

2 个答案:

答案 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

详情可在博客文章中找到。