Получить стоимость установки функций до установки
-
24-10-2019 - |
Вопрос
Мы делаем пользовательский Boostrapper / внешний пользовательский интерфейс для нашей установки.
Мы хотим предоставить диалоговое окно «Пользовательская установка» (например, в MSI), чтобы пользователь выбрал функции (ы), которые они хотят установить или удалить.
В настоящее время мы можем прочитать функции (и другие данные о функциях, такие как описание) из самой базы данных MSI (запустив SQL -запрос на Feature
стол).
Тем не менее, мы также хотим отобразить стоимость установки функции. Диалог установки Windows «Пользовательская установка» способен сделать это.
Я думаю, что мы можем имитировать поведение, выполнив следующее:
- Выберите
Feature
что вы хотите получить стоимость - С использованием
FeatureComponents
стол, получитеComponent
связан с этой функцией из 1 - С использованием
File
таблица, добавьтеFileSize
файлов, связанных с компонентом, идентифицированным в 2 - Сумма 3 - это стоимость установки функции
Вопрос:
- Есть ли API (от DTF или MSI.DLL), который мы можем использовать, чтобы получить стоимость функции до установки? (Eсть
FeatureInfo.GetCost
Метод в DTF, но вы не можете использовать это напрямую. Продукт должен быть установлен первым, прежде чем вы сможете позвонитьFeatureInfo.GetCost
изProductInstallation
) - Если нет 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. это много быстрее и много более стабильный.