wix - modificar - Obtenga el costo de instalación de características antes de la instalación
metaetiqueta wix (2)
Esta no es la respuesta que está buscando, pero sugiero que se calcule previamente el tamaño de las características en el momento de la compilación y el uso de una tabla precalculada durante la instalación. Esto es lo que hacemos en Burn en WiX v3.6. Es mucho más rápido y mucho más estable.
Estamos haciendo una interfaz de usuario boostrapper / externa personalizada para nuestra instalación.
Queremos proporcionar un cuadro de diálogo "Instalación personalizada" (como en MSI) para permitir al usuario elegir la (s) característica (es) que desea instalar o eliminar.
Actualmente, podemos leer las características (y otros detalles de características como la descripción) de la base de datos MSI (ejecutando una consulta SQL en la tabla de Feature
).
Sin embargo, también queremos mostrar el costo de instalación de una función. El cuadro de diálogo "Instalación personalizada" de Windows Installer es capaz de hacer esto.
Creo que podemos imitar el comportamiento haciendo lo siguiente:
- Elija una
Feature
que desea obtener el costo - Usando la tabla
FeatureComponents
, obtenga elComponent
asociado con la función desde 1 - Usando la tabla
File
, agregue elFileSize
deFileSize
de los archivos asociados con el componente identificado en 2 - La suma de 3 es el costo de la instalación de características
Pregunta:
- ¿Existe una API (ya sea de DTF o MSI.DLL) que podamos usar para obtener el costo de una función ANTES de la instalación? (Hay un método
FeatureInfo.GetCost
en DTF pero no puede usarlo directamente. El producto debe instalarse antes de poder llamar aFeatureInfo.GetCost
desdeProductInstallation
) - Si no hay API, ¿el procedimiento indicado arriba es apropiado o correcto para calcular el costo de una instalación de características?
¡Gracias! :)
ACTUALIZACIÓN # 1
Creo que hay una manera de obtener el costo de una instalación de características a través de la API, incluso ANTES de comenzar la instalación. Así es como lo hice:
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();
llamar info.name
devuelve con éxito el nombre de la característica. Sin embargo, llamar info.GetCost
devolverá una InvalidHandlerException
con un mensaje: "gestor de selección no inicializado".
Aquí es donde estoy actualmente.
Actualización # 2:
InvalidHandlerException
la InvalidHandlerException
porque no estoy invocando las rutinas de cálculo de costos necesarias antes de llamar a info.GetCost
. Aquí está mi código modificado:
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();
Ya no recibo la InvalidHandlerException, pero el costo del archivo que se devuelve es -1099511627776.
Sí, hay una API. Necesita obtener una sesión de MSI llamando a OpenPackage. Al hacerlo, tendrá acceso a la lista de características que le dará acceso al método GetCost.
1 Encontrado : debe realizar 4 acciones estándar antes de calcular el costo: CostInitialize , FileCost , CostFinalize e 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();