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:

  1. Elegir Feature que quieres obtener el costo
  2. Utilizando el FeatureComponents mesa, obtenga el Component asociado con la característica de 1
  3. Utilizando el File mesa, agregue el FileSize de los archivos asociados con el componente identificado en 2
  4. La suma de 3 es el costo de la instalación de funciones

Pregunta:

  1. ¿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 llamar FeatureInfo.GetCost de ProductInstallation)
  2. 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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top