Получить стоимость установки функции до установки - PullRequest
0 голосов
/ 26 января 2011

Мы создаем пользовательский интерфейс Boosterpper / внешний интерфейс для нашей установки.

Мы хотим предоставить диалоговое окно «Выборочная установка» (как в MSI), чтобы позволить пользователю выбирать функции, которые он хочет установить или удалить.

В настоящее время мы можем читать функции (и другие подробности функции, такие как описание) из самой базы данных MSI (запустив запрос SQL к таблице Feature).

Однако мы также хотим отобразить стоимость установки функции. Диалоговое окно «Выборочная установка» установщика Windows способно сделать это.

Я думаю, что мы можем имитировать поведение, выполнив следующее:

  1. Выберите Feature, что вы хотите получить стоимость
  2. Используя таблицу FeatureComponents, получите Component, связанный с функцией, от 1
  3. Используя таблицу File, добавьте FileSize файлов, связанных с компонентом, указанным в 2
  4. Сумма от 3 - это стоимость функции установки

Вопрос:

  1. Есть ли API (из DTF или MSI.DLL), который мы можем использовать, чтобы получить стоимость функции ДО установки? (В DTF есть метод FeatureInfo.GetCost, но вы не можете использовать его напрямую. Прежде чем вы сможете вызвать FeatureInfo.GetCost из ProductInstallation), необходимо установить продукт
  2. Если API отсутствует, является ли приведенная выше процедура подходящей или правильной для расчета стоимости установки компонента?

Спасибо! :)

ОБНОВЛЕНИЕ № 1

Я думаю, что есть способ получить стоимость установки компонента через API, даже до начала установки. Вот как я это сделал:

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

вызов info.name успешно возвращает имя функции. Однако, вызов info.GetCost вернет InvalidHandlerException с сообщением: «менеджер выбора не инициализирован».

Вот где я сейчас нахожусь.

Обновление № 2:

Я получаю InvalidHandlerException, потому что я не вызываю необходимые процедуры оценки стоимости файла перед тем, как позвонить info.GetCost. Вот мой модифицированный код:

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

Я больше не получаю InvalidHandlerException, но вся возвращаемая стоимость файла равна -1099511627776.

Ответы [ 2 ]

1 голос
/ 11 февраля 2011

Да, есть API.Вам нужно получить сессию MSI, позвонив в OpenPackage.Таким образом, вы получите доступ к списку функций, который предоставит вам доступ к методу GetCost.

1 Прим. : перед вычислением стоимости необходимо выполнить 4 стандартных действия: CostInitialize , FileCost , CostFinalize и 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();
1 голос
/ 10 февраля 2011

Это не тот ответ, который вы ищете, но я бы предложил предварительно рассчитать размеры компонентов во время сборки и использовать предварительно вычисленную таблицу во время установки. Это то, что мы делаем в Burn в WiX v3.6. Это намного быстрее и намного более стабильно.

...