Frage

Für unsere Installation erstellen wir eine benutzerdefinierte Boostrapper / externe Benutzeroberfläche.

Wir möchten ein Dialogfeld "benutzerdefinierte Installation" (wie in MSI) bereitstellen, damit der Benutzer die Funktionen auswählen oder entfernen möchten.

Derzeit können wir die Funktionen (und andere Funktionsdetails wie Beschreibung) aus der MSI -Datenbank selbst lesen (indem wir eine SQL -Abfrage auf dem ausführen Feature Tisch).

Wir möchten jedoch auch die Kosten für die Installation einer Funktion anzeigen. Windows Installer "benutzerdefinierte Installation" -Dialog kann dazu in der Lage sein.

Ich denke, wir können das Verhalten nachahmen, indem wir Folgendes tun:

  1. Wähle a Feature dass Sie die Kosten erhalten möchten
  2. Verwendung der FeatureComponents Tisch, holen Sie sich die Component mit der Funktion von 1 verbunden
  3. Verwendung der File Tabelle, fügen Sie die hinzu FileSize der mit der in 2 identifizierten Komponente zugeordneten Dateien
  4. Die Summe von 3 sind die Kosten für die Feature -Installation

Frage:

  1. Gibt es eine API (entweder von DTF oder MSI.DLL), mit der wir vor der Installation die Kosten für eine Funktion erhalten können? (Da ist ein FeatureInfo.GetCost Methode in DTF, aber Sie können das nicht direkt verwenden. Das Produkt muss zuerst installiert werden, bevor Sie anrufen können FeatureInfo.GetCost aus ProductInstallation)
  2. Wenn es keine API gibt, ist das oben angegebene oder korrekte Verfahren, um die Kosten einer Feature -Installation zu berechnen?

Vielen Dank! :)

Update Nr. 1

Ich denke, es gibt eine Möglichkeit, die Kosten für eine Feature -Installation über die API selbst vor Beginn der Installation zu erhalten. So hat ich es gemacht:

Installer.SetInternalUI(InstallUIOptions.Silent);

Session s = Installer.OpenPackage(@"C:\a.msi", false);

foreach (FeatureInfo info in s.Features)
{
    MessageBox.Show(info.Name);
    MessageBox.Show(info.GetCost(false, false, InstallState.Unknown).ToString());
}
s.Close();

Berufung info.name Gibt erfolgreich den Namen der Funktion zurück. Allerdings anrufen info.GetCost wird zurückkehren und InvalidHandlerException mit einer Nachricht: "Auswahlmanager nicht initialisiert".

Hier bin ich gerade bei.

Update Nr. 2:

Ich bekam das InvalidHandlerException Weil ich nicht die benötigten beruft Dateikostenroutinen Bevor ich anrufe info.GetCost. Hier ist mein geänderter Code:

  Installer.SetInternalUI(InstallUIOptions.Silent);

  Session s = Installer.OpenPackage(@"C:\1.msi", false);
  s["ROOTDRIVE"] = @"C:\";
  s.DoAction("CostInitialize");
  s.DoAction("FileCost");
  s.DoAction("CostFinalize");

  foreach (FeatureInfo info in s.Features)
  {
       long cost = info.GetCost(false, false, InstallState.Local);
       MessageBox.Show(info.Title + " " + cost);
  }
  s.Close();

Ich erhalte nicht mehr die InvalidHandRerexception, aber alle zurückgegebenen Dateikosten sind -1099511627776.

War es hilfreich?

Lösung 2

Ja, es gibt eine API. Sie müssen eine MSI -Sitzung erhalten, indem Sie OpenPackage anrufen. Auf diese Weise haben Sie Zugriff auf die Funktionsliste, mit der Sie Zugriff auf die GetCost -Methode erhalten.

1 gotcha: Sie müssen 4 Standardaktionen ausführen, bevor Sie die Kosten berechnen: Kostinitialisieren, Filecost, Kostenfinale und Installvalidat.

    Installer.SetInternalUI(InstallUIOptions.Silent);

    Session s = Installer.OpenPackage(@"C:\1.msi", false);
    s.DoAction("CostInitialize");
    s.DoAction("FileCost");
    s.DoAction("CostFinalize");
    s.DoAction("InstallValidate");

    foreach (FeatureInfo info in s.Features)
    {
        long cost = info.GetCost(false, false, InstallState.Local);
        MessageBox.Show(info.Title + " " + cost);
    }
    s.Close();

Andere Tipps

Dies ist nicht die Antwort, nach der Sie suchen, aber ich würde vorschlagen, die Größen der Funktionen zum Bauzeit vorzubereiten und während der Installation eine vorgebaute Tabelle zu verwenden. Das machen wir in Brennen in Wix v3.6. es ist viel schneller und viel stabiler.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top