Question

Nous faisons une boostrapper personnalisée / interface utilisateur externe pour notre installation.

Nous voulons fournir une boîte de dialogue « Installation personnalisée » (comme dans MSI) pour permettre à l'utilisateur de choisir fonctionnalités (s) qu'ils souhaitent installer ou supprimer.

À l'heure actuelle, nous sommes en mesure de lire les caractéristiques (et d'autres détails de caractéristiques comme la description) de la base de données MSI lui-même (en exécutant une requête SQL sur la table Feature).

Cependant, nous voulons aussi afficher le coût de l'installation d'une fonction. dialogue Windows Installer "Installation personnalisée" est capable de le faire.

Je pense que nous pouvons imiter le comportement en procédant comme suit:

  1. Choisissez un Feature que vous voulez obtenir le coût
  2. Utilisation de la table FeatureComponents, faire le Component associé à la fonction de 1
  3. Utilisation de la table File, ajoutez le FileSize des fichiers associés à l'élément identifié dans 2
  4. La somme de 3 est le coût de l'installation de la fonctionnalité

Question:

  1. Y at-il une API (soit à partir DTF ou MSI.DLL) que nous pouvons utiliser pour obtenir le coût d'une caractéristique AVANT l'installation? (Il existe une méthode de FeatureInfo.GetCost dans DTF mais vous ne pouvez pas l'utiliser directement. Le produit doit être installé avant de pouvoir appeler FeatureInfo.GetCost de ProductInstallation)
  2. S'il n'y a pas d'API, la procédure est donnée ci-dessus appropriée ou correcte pour calculer le coût d'une installation de fonctionnalité?

Merci! :)

Mise à jour # 1

Je pense qu'il ya un moyen d'obtenir le coût d'une installation de fonctionnalité via l'API même avant de commencer l'installation. Voici comment je l'ai fait:

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();

appelant info.name retourne avec succès le nom de la fonction. Toutefois, l'appel info.GetCost renverra un InvalidHandlerException avec un message. « Gestionnaire de sélection non initialisé »

Voici où je suis actuellement.

Mise à jour n ° 2:

Je recevais le InvalidHandlerException parce que je ne suis pas Invoquer le besoin routines coûts de fichiers avant d'appeler info.GetCost. Voici mon code modifié:

  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();

Je ne reçois plus le InvalidHandlerException mais tous les frais de dossier étant renvoyé est -1.099.511.627.776.

Était-ce utile?

La solution 2

Yes, there is an API. You need to get an MSI Session by calling OpenPackage. By doing so, you will have access to the Feature list which will give you access to the GetCost method.

1 Gotcha: You need to perform 4 standard actions before calculating the cost: CostInitialize, FileCost, CostFinalize and InstallValidate.

    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();

Autres conseils

This isn't the answer you are looking for but I would suggest pre-calculating the sizes of the features at build time and using a precalculated table during install. This is what we do in Burn in WiX v3.6. It is much faster and much more stable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top