【问题标题】:How to install specific MSIs in WiX/Burn如何在 WiX/Burn 中安装特定的 MSI
【发布时间】:2014-09-15 19:00:04
【问题描述】:

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

【问题讨论】:

    标签: .net wpf wix windows-installer burn


    【解决方案1】:

    要找出客户端缺少哪些 MSI,您可以解析“BootstrapperApplicationData.xml”文件。此文件包含有关您的捆绑包的一般信息。它应该位于临时目录中(%temp%{安装程序的guid}\ba1\,您可以按win+r 并写入%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) 后使用 PlanPackageBeginEvent,通过将事件参数中的 State 属性设置为 Absent 或 Present 来实际告诉引擎应该安装哪些包(它为每个包调用一次)。

    我建议阅读以下内容: https://www.wrightfully.com/part-1-of-writing-your-own-net-based-installer-with-wix-overview

    【讨论】:

    • 我不知道如何确定有效负载 msi 是否丢失。
    • 我不确定我是否清楚地了解您在寻找什么。您可以从 BootstrapperApplicationData.xml 获取捆绑包中要安装的包的信息,以及从 DetectPackageComplete 事件获取机器上安装了哪些包的信息。这是否足以知道哪些软件包未安装但可以安装?
    • 我想知道哪些包有效负载丢失。不是应用程序是否安装,而是源 msi 是否存在于客户端机器上。
    • 你有什么想法吗?我意识到我需要的信息比我以前想象的要多。我计划使用 MSI 中的“SECURECUSTOMVARIABLES”属性来动态生成表单以收集安装程序所需的信息。
    【解决方案2】:

    我写了一系列讨论这个话题的博客文章,你可以在这里找到:https://www.wrightfully.com/part-1-of-writing-your-own-net-based-installer-with-wix-overview/

    具体来说,Handling Current and Future State 上的帖子会检测当前安装状态并设置未来状态(要采取的操作)。

    使用您当前正在使用的DetectPackageComplete,e.State 将为您提供软件包的当前安装状态,这是其中之一(其中PresentAbsent 是您的关键会关心的):

    public enum PackageState
    {
        Unknown,
        Obsolete,
        Absent,
        Cached,
        Present,
        Superseded,
    }
    

    要设置用户想要执行的操作,您需要为PlanPackageBegin 注册一个事件处理程序,您需要在其中设置State 属性。例如:

    BootstrapperApplication.PlanPackageBegin += SetPackagePlannedState;
    
    private void SetPackagePlannedState( object sender, PlanPackageBeginEventArgs planPackageBeginEventArgs)
    {
        var pkgId = planPackageBeginEventArgs.PackageId;
    
        planPackageBeginEventArgs.State = RequestState.Present;
    }
    

    可以在博文中找到完整的详细信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-26
      • 1970-01-01
      相关资源
      最近更新 更多