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