Вопрос

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

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

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

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

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

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

Вопрос:

  1. Есть ли API (от DTF или MSI.DLL), который мы можем использовать, чтобы получить стоимость функции до установки? (Eсть FeatureInfo.GetCost Метод в DTF, но вы не можете использовать это напрямую. Продукт должен быть установлен первым, прежде чем вы сможете позвонить 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

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

1 gotcha: Вам нужно выполнить 4 стандартных действий, прежде чем вычислять стоимость: Костинициализовать, Filecost, Стоимость финансирования а также 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();

Другие советы

Это не тот ответ, который вы ищете, но я бы посоветовал предварительно разыскивать размеры функций во время сборки и использовать предварительную таблицу во время установки. Это то, что мы делаем в Гореть в Wix V3.6. это много быстрее и много более стабильный.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top