簡體   English   中英

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

[英]How to install specific MSIs in WiX/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

要找出客戶端缺少的MSI,可以解析“ BootstrapperApplicationData.xml”文件。 該文件包含有關捆綁軟件的一般信息。 它應該位於temp目錄中(%temp%{安裝程序的向導} \\ ba1 \\,您可以按win + r並寫入%temp%進入臨時文件夾)。 Burn會在其中提取BA 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。

通過將Event參數的State屬性設置為Absent或Present,可以在調用Engine.Plan(LaunchAction.Install)之后使用PlanPackageBeginEvent實際告訴引擎應該安裝哪些軟件包(每個軟件包都調用一次)。

我建議閱讀以下內容: https : //www.wrightfully.com/part-1-of-writing-your-own-net-based-installer-with-wix-overview

我寫了一系列討論該主題的博客文章,您可以在這里找到: https : //www.wrightfully.com/part-1-of-writing-your-own-net-based-installer-with-wix -overview /

具體來說,關於處理當前和將來狀態的發布會逐步檢測當前安裝狀態並設置將來狀態(要采取的措施)。

使用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;
}

完整的詳細信息可以在博客文章中找到。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM