Erhalten Sie die Feature -Installationskosten vor der Installation
-
24-10-2019 - |
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:
- Wähle a
Feature
dass Sie die Kosten erhalten möchten - Verwendung der
FeatureComponents
Tisch, holen Sie sich dieComponent
mit der Funktion von 1 verbunden - Verwendung der
File
Tabelle, fügen Sie die hinzuFileSize
der mit der in 2 identifizierten Komponente zugeordneten Dateien - Die Summe von 3 sind die Kosten für die Feature -Installation
Frage:
- 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önnenFeatureInfo.GetCost
ausProductInstallation
) - 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.
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.