Ottenere costi di installazione funzione prima dell'installazione
-
24-10-2019 - |
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:
- Scegli un
Feature
che si desidera ottenere il costo - Utilizzando la tabella
FeatureComponents
, ottenere ilComponent
associato con la funzione dal 1 - Utilizzando la tabella
File
, aggiungere ilFileSize
dei file associati al componente indicato nel 2 - La somma da 3 è il costo dell'installazione funzione
Domanda:
- 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 chiamareFeatureInfo.GetCost
daProductInstallation
) - 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.
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.