Obtener el costo de instalación de la función antes de la instalación
-
24-10-2019 - |
Pregunta
Estamos haciendo una interfaz de usuario externa personalizada para nuestra instalación.
Queremos proporcionar un cuadro de diálogo de "instalación personalizada" (como en MSI) para permitir al usuario elegir características que deseen instalar o eliminar.
Actualmente, podemos leer las características (y otros detalles de funciones como la descripción) de la base de datos MSI (ejecutando una consulta SQL en el Feature
mesa).
Sin embargo, también queremos mostrar el costo de instalar una función. El cuadro de diálogo de "instalación personalizada" de Windows Installer es capaz de hacerlo.
Creo que podemos imitar el comportamiento haciendo lo siguiente:
- Elegir
Feature
que quieres obtener el costo - Utilizando el
FeatureComponents
mesa, obtenga elComponent
asociado con la característica de 1 - Utilizando el
File
mesa, agregue elFileSize
de los archivos asociados con el componente identificado en 2 - La suma de 3 es el costo de la instalación de funciones
Pregunta:
- ¿Hay 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
FeatureInfo.GetCost
Método en DTF pero no puede usarlo directamente. El producto debe instalarse primero antes de que pueda llamarFeatureInfo.GetCost
deProductInstallation
) - Si no hay API, ¿es el procedimiento dado anteriormente 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 funciones a través de la API incluso antes de iniciar 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();
vocación info.name
Devuelve con éxito el nombre de la función. Sin embargo, llamando info.GetCost
devolverá un InvalidHandlerException
Con un mensaje: "Manager de selección no inicializado".
Aquí es donde estoy actualmente.
Actualización #2:
Estaba obteniendo el InvalidHandlerException
Porque no estoy invocando la necesidad Rutinas de costos de archivos Antes de llamar 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 obtengo la InvalidHandLerException, pero todo el costo de archivo que se devuelve es -1099511627777.
Solución 2
Sí, hay una API. Debe obtener una sesión de MSI llamando a OpenPackage. Al hacerlo, tendrá acceso a la lista de funciones que le dará acceso al método GetCost.
1 Gotcha: Debe realizar 4 acciones estándar antes de calcular el costo: Costinitializar, Filecostés, Costindintorizar y 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();
Otros consejos
Esta no es la respuesta que está buscando, pero sugeriría precalcular los tamaños de las características en el tiempo de compilación y usar una tabla precalculada durante la instalación. Esto es lo que hacemos en Quemar En Wix v3.6. Está mucho más rápido y mucho mas estable.