Domanda

Stiamo facendo un boostrapper custom / utente esterna per la nostra installazione.

Vogliamo fornire una finestra di dialogo "Installazione personalizzata" (come in MSI) per consentire all'utente di scegliere caratteristica (s) che vogliono installare o rimuovere.

Al momento, siamo in grado di leggere le caratteristiche (e altri dettagli caratteristica come descrizione) dal database MSI stesso (eseguendo una query SQL sul tavolo Feature).

Tuttavia, vogliamo anche visualizzare il costo di installazione di una caratteristica. dialogo di Windows Installer "Installazione personalizzata" è capace di fare questo.

Credo che siamo in grado di simulare il comportamento nel seguente modo:

  1. Scegli un Feature che si desidera ottenere il costo
  2. Utilizzando la tabella FeatureComponents, ottenere il Component associato con la funzione dal 1
  3. Utilizzando la tabella File, aggiungere il FileSize dei file associati al componente indicato nel 2
  4. La somma da 3 è il costo dell'installazione funzione

Domanda:

  1. C'è un'API (sia da DTF o MSI.DLL) che possiamo utilizzare per ottenere il costo di una caratteristica prima dell'installazione? (C'è un metodo FeatureInfo.GetCost in DTF, ma non è possibile utilizzare che direttamente. Il prodotto deve essere installato prima di poter chiamare FeatureInfo.GetCost da ProductInstallation)
  2. Se non c'è API, è la procedura di cui sopra appropriato o corretta per calcolare il costo di un impianto funzione?

Grazie! :)

UPDATE # 1

Credo che ci sia un modo per ottenere il costo di un impianto funzione tramite l'API anche prima di iniziare l'installazione. Ecco come ho fatto:

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();

chiamando info.name ritorna con successo il nome della funzione. Tuttavia, chiamando info.GetCost restituirà un InvalidHandlerException con un messaggio:. "Manager di selezione non inizializzata"

Ecco dove sono attualmente.

Aggiornamento # 2:

mi è stato sempre il InvalidHandlerException perché io non sto invocando la necessaria file costano routine prima che chiami info.GetCost. Ecco il mio codice modificato:

  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();

Non sono più ottenendo l'InvalidHandlerException ma tutti i costi file in fase restituito è -1099511627776.

È stato utile?

Soluzione 2

Sì, c'è un'API. È necessario per ottenere una sessione MSI chiamando OpenPackage. In questo modo, si avrà accesso alla lista caratteristica che vi darà accesso al metodo GetCost.

1 Gotcha : è necessario eseguire 4 azioni standard prima di calcolare il 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();

Altri suggerimenti

Questa non è la risposta che state cercando, ma vorrei suggerire pre-calcolare le dimensioni delle caratteristiche in fase di compilazione e l'utilizzo di una tabella precalcolata durante l'installazione. Questo è ciò che facciamo in Burn in WiX v3.6. E ' molto più veloce e molto più stabile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top